![根据给定行号上的模式提取数据](https://linux22.com/image/106983/%E6%A0%B9%E6%8D%AE%E7%BB%99%E5%AE%9A%E8%A1%8C%E5%8F%B7%E4%B8%8A%E7%9A%84%E6%A8%A1%E5%BC%8F%E6%8F%90%E5%8F%96%E6%95%B0%E6%8D%AE.png)
我试图找到一行(第 6 行),就像
"password": "......."
在所有行开头的文件中"whatever here": "...."
然后,我想提取:
符号后面写的任何内容,并删除所有多余的单词和字符:“password”:“”并在引号之间取.......部分。
我想将其定义为一个新变量(这里我将其命名为 user1),因为稍后我想将该变量替换为同一脚本中的新命令以获取网址。
我已经使用了这个命令,但它不起作用:
user1=`head -6| grep -v "\<"password:"\>" myfile.txt`
wget '....$user1&......
有人可以帮我吗?我已经研究了好几天了,但无法解决这个问题。
答案1
尝试:
user1=$(
sed -n '
6!d; # disregard any line but the 6th one
s/^[[:blank:]]*"password"[[:blank:]]*:[[:blank:]]*"\(.*\)".*/\1/p
q' myfile.txt
)
如果您希望$user1
将其作为 CGI GET 参数传递,则需要%XX
在其中进行编码。
使用ksh93
,您可以执行以下操作:
wget "http://host.example/cgi-bin/script?user1=$(printf '%#H' "$user1")"
对于其他 shell,您可以采取perl
URI 转义:
uri_escape() {
perl -MURI::Escape -le 'print map {uri_escape $_} @ARGV' -- "$@"
}
wget "http://host.example/cgi-bin/script?user1=$(uri_escape "$user1")"
或者使用whichcurl
代替wget
它可以自行编码参数:
curl -G -O --data-urlencode "user1=$user1" 'http://host.example/cgi-bin/script'
答案2
假设一个数据文件('afile')的内容是:
$ cat afile
now
is
the
time
for
"password": "all good men"
to
come
to
the
aid
of
their
country
然后 Bash 的以下行找到该行,"password":
然后提取引号之间的内容:
$ user1=$(cat afile | grep '^[[:blank:]]*"password"[[:blank:]]*:' | sed 's/^[[:blank:]]*"password":[[:blank:]]*//' | sed 's/"//g')
$ echo $user1
all good men
如果您确定所讨论的行正好位于第 6 行,那么以下方法也有效:
$ user1=$(cat afile | sed '6!d' | sed 's/^[[:blank:]]*"password":[[:blank:]]*//' | sed 's/"//g')
$ echo $user1
all good men