我使用下面的命令来grep并获取位于两个字符串之间的子字符串。
echo "This is an example" | grep -o -P '(?<=This).*(?=example)'
会给 is an
现在我收到了大量具有以下格式的原始字符串
"],"id":"1785695Jkc","
我也尝试过对这个String使用上面提到的命令。但它没有用。
grep -o -P '(?<="],"id":").*(?=",")'
答案 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