【问题标题】:extract string between two symbols in a one-line string提取单行字符串中两个符号之间的字符串
【发布时间】:2021-12-15 00:34:19
【问题描述】:

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

sed -n 's/.*\{"url\(.*\)"}.*/\1/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

【问题讨论】:

  • 如果这是 JSON 的一部分,请发布有效的 JSON。
  • 对不起,是的。让它在 R 中工作。所以关闭它。

标签: awk sed


【解决方案1】:

如果您损坏了 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( hex)是" in ASCII),然后for每个字段我print它。

(在 GNU Awk 5.0.1 中测试)

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

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

解释:-o 表示只打印匹配的内容。

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

【讨论】:

    【解决方案2】:

    使用sed

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

    【讨论】:

    • 嗨,我的真实数据有点不同,导致您的解决方案不起作用。我更新了一个更现实的例子。
    • @user2300940 请检查编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2013-12-11
    • 2013-12-12
    • 2014-02-26
    相关资源
    最近更新 更多