根据给定行号上的模式提取数据

根据给定行号上的模式提取数据

我试图找到一行(第 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,您可以采取perlURI 转义:

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

相关内容