在Linux上提取两个字符串之间的子字符串

时间:2018-02-16 04:30:02

标签: linux bash unix awk

我使用下面的命令来grep并获取位于两个字符串之间的子字符串。

echo "This is an example" | grep -o -P '(?<=This).*(?=example)'

会给 is an

现在我收到了大量具有以下格式的原始字符串

"],"id":"1785695Jkc","

我也尝试过对这个String使用上面提到的命令。但它没有用。

grep -o -P '(?<="],"id":").*(?=",")'

2 个答案:

答案 0 :(得分:2)

请注意,shell会从字符串中删除外部引号:

$ echo "This is an example"
This is an example
$ echo "],"id":"1785695Jkc","
],id:1785695Jkc,

如果您想保留双引号,则需要引用它们。在这里,我们将字符串放在单引号中,这样可以保留双引号:

$ echo '"],"id":"1785695Jkc","'
"],"id":"1785695Jkc","

现在,您的grep命令将起作用:

$ echo '"],"id":"1785695Jkc","'  | grep -o -P '(?<="],"id":").*(?=",")'
1785695Jkc

文档

引用删除记录在man bash

  

报价删除
         在前面的扩展之后,所有未引用的字符\,'和“的出现都不是由上述之一产生的   扩展被删除。

答案 1 :(得分:2)

您还没有说明您正在寻找的输出。但awk可能会让您最容易从逗号分隔的值集中提取内容:

$ s='"],"id":"1785695Jkc","'
$ awk -F, '{print $2}' <<<"$s"
"id":"1785695Jkc"
$ awk -F, '{split($2,a,":"); print a[2]}' <<<"$s"
"1785695Jkc"

或者,如果您愿意,

$ awk -F: -v f='"id"' '{a[$1]=$2} END {print a[f]}' RS=, - <<<"$s"
"1785695Jkc"

第二种表示法以逗号分隔的值对读入,它使用冒号作为字段分隔符,因此您也可以这样做:

$ awk -F: -v f='id' '{a[$1]=$2} END {print a[f]}' RS=, - <<<"one:red,id:hello,foo:bar"
hello