提取一行字符串中两个符号之间的字符串

extract string between two symbols in a one-line string

我有一个包含多个 url 的单行,我想将其提取并打印为新行。如示例所示,我想提取 {"url"} 之间的部分并作为新行打印。试过这样的事情:

sed -n 's/.*\{"url\(.*\)"}.*//p'

"crams":{"tumor":{"url:rvrvwedre"}}fawirnfaiwrunfiawun"crams":{"tumor":{"url:rvrvwdwEDerare"}}nowiaunrvwiorunwaeiou"crams":{"tumor":{"url:rvrverSQWSare"}}ieurnveiarunviearuv"crams":{"tumor":{"url:rvrveraSQWSQre"}}

输出

url:rvrvwedre
url:rvrvwdwEDerare
url:rvrverSQWSare
url:rvrveraSQWSQre

使用sed

$ sed 's/.[^{]*.[^{]*[^:]*\(url[^"]*\)[^}]*../\n/g' input_file
url:rvrvwedre
url:rvrvwdwEDerare
url:rvrverSQWSare
url:rvrveraSQWSQre

如果你破坏了 JSON 并且因此使用正确的 JSON 解析器不是选项我会使用 GNU AWK 以下方式,让 file.txt 内容为

"crams":{"tumor":{"url:rvrvwedre"}}fawirnfaiwrunfiawun"crams":{"tumor":{"url:rvrvwdwEDerare"}}nowiaunrvwiorunwaeiou"crams":{"tumor":{"url:rvrverSQWSare"}}ieurnveiarunviearuv"crams":{"tumor":{"url:rvrveraSQWSQre"}}

然后

awk 'BEGIN{FPAT="url:[^\x22]*"}{for(i=1;i<=NF;i+=1){print $i}}' file.txt

输出

url:rvrvwedre
url:rvrvwdwEDerare
url:rvrverSQWSare
url:rvrveraSQWSQre

解释:我使用FPAT(Field PATtern)通知AWK该字段是url:后跟0个或多个not-"(我用\x22来得到 " 没有结尾的字符串,22(十六进制)在 ASCII 中是 "),然后 for 每个字段我 print 它。

(在 GNU Awk 5.0.1 中测试)

如果您被允许使用 GNU grep 那么您可能会选择使用

grep -o 'url:[^"]*' file.txt

说明:-o表示只打印匹配的内容。

(在 grep (GNU grep) 3.4 中测试)