需要使用 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
使用 awk
的 match
功能,也可以尝试以下操作。
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=]
"
右双引号
我正在尝试通过 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
使用 awk
的 match
功能,也可以尝试以下操作。
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=]"
右双引号