【问题标题】:Extracting a substring between two strings on Linux [duplicate]在Linux上提取两个字符串之间的子字符串[重复]
【发布时间】:2018-07-26 23:15:28
【问题描述】:

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

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

这会给 is an

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

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

我也尝试对这个字符串使用上述命令。但它没有用。

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

【问题讨论】:

  • 您的标签暗示您正在寻求bashawk 的帮助,但您的问题中没有包含bash 或awk 代码。您是否真的需要grep 的帮助,或者您想向我们展示您迄今为止在 bash 或 awk 中所做的工作,以便我们可以帮助您解决这些问题?另外,根据您提供的示例输入,您正在寻找的输出到底是什么?

标签: linux bash unix awk


【解决方案1】:

请注意,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

引号删除
在前面的扩展之后,所有未加引号的字符 \、' 和 " 不是由上述之一引起的 扩展被移除。

【讨论】:

    【解决方案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
    

    【讨论】:

    • 我期待 1785695Jkc 并且子字符串应该在第一次出现匹配
    猜你喜欢
    • 2013-01-31
    • 2013-12-11
    • 2018-05-11
    • 1970-01-01
    • 2020-03-23
    • 2019-03-03
    • 2011-03-23
    • 1970-01-01
    相关资源
    最近更新 更多