需要使用 curl 来 grep 一个特定的字符串

Need to grep a specific string using curl

我正在尝试通过 curl 从页面获取语言代码

我写在下面并工作...

curl -Ls yahoo.com | grep "lang=" | head -1 | cut -d ' ' -f 3 | cut -d"\"" -f 2

但有时代码会有所不同,例如

 curl -Ls stick-it.app | grep "lang=" | head -1 | cut -d ' ' -f 3 | cut -d"\"" -f 2

他们写得像

<html dir="rtl" lang="he-IL">

我只需要得到he-IL

如果有其他方法,我将不胜感激...

在每个 Unix 机器上的任何 shell 中使用任何 sed:

$ curl -Ls yahoo.com | sed -n 's/^<html.* lang="\([^"]*\).*//p'
en-US

如果你有 gnu-grep 然后使用 -P (perl regex):

curl -Ls yahoo.com | grep -oP '\slang="\K[^"]+'

he-IL

使用 awkmatch 功能,也可以尝试以下操作。

your_curl_command | awk '
match([=10=],/^<html.*lang="[^"]*/){
  val=substr([=10=],RSTART,RLENGTH)
  sub(/.*lang="/,"",val)
  print val
}
'

解释:为以上添加详细解释。

your_curl_command | awk '          ##Starting awk program from here.
match([=11=],/^<html.*lang="[^"]*/){   ##using match function to match regex starting from <html till lang=" till next 1st occurrence of "
  val=substr([=11=],RSTART,RLENGTH)    ##Creating val which has substring of matched values.
  sub(/.*lang="/,"",val)           ##Substituting everything till lang=" with NULL in val here.
  print val                        ##printing val here.
}
'

使用 gnu awk 的另一种变体和使用 match 捕获组的模式:

match(string, regexp [, array])

curl -Ls yahoo.com | awk 'match([=10=], /<html [^<>]*lang="([^"]*)"/, a) {print a[1]}'

输出

en-US

模式匹配

  • <html 字面匹配
  • [^<>]* 匹配 0+ 除 <>
  • 之外的任何字符
  • lang="字面匹配
  • ([^"]*) 捕获 组 1(在示例代码中用 a[1] 表示)匹配 0+ 次除 "[= 之外的任何字符37=]
  • " 右双引号