【问题标题】:Regex to match string between quotes正则表达式匹配引号之间的字符串
【发布时间】:2013-05-20 13:58:28
【问题描述】:

我正在使用 shell 脚本读取文件,然后将输出传送到 grep 并尝试提取包含在两个引号之间的字符串(不包括引号)。

./readFile.sh | grep -e "[\^\"]*[\?\"]"

这将返回我正在阅读的文件的全部内容。

我的文件是这样组织的:

TITLE="foo"
DATA="bar"
SERVER="foo.bar.server"

我在这里阅读了正则表达式教程 http://www.regular-expressions.info/lookaround.html 并尝试尽可能地使用前瞻和后瞻,但我不明白这里有什么问题。

【问题讨论】:

    标签: regex linux bash shell


    【解决方案1】:

    使用 grep 进行后视检查此示例

    kent$  echo 'TITLE="foo"
    DATA="bar"
    SERVER="foo.bar.server"'|grep -Po '(?<=")[^"]*'
    foo
    bar
    foo.bar.server
    

    替代方案是grep -Po '"\K[^"]*'

    【讨论】:

    • 这行得通,但是,我在每个字符串的输出之间有两个空行
    • readFile.sh 的输出是什么?如果它看起来与答案中的示例完全相同,则没有空行。
    【解决方案2】:

    我不明白你为什么使用脚本来读取文件,因为 grep 处理文件,但这是你自己的选择(也许你做了一些预处理)。

    这会提取 '"' 之间的内容:

    $ grep -o '".*"' <file>
    "foo"
    "bar"
    "foo.bar.server"
    

    如果需要去掉'"':

    $ grep -o '".*"' <file> | tr -d '"'
    foo
    bar
    foo.bar.server
    

    【讨论】:

    • 好吧,我的脚本不只是读取文件,为了示例的简单性,我只是让它看起来如此。
    【解决方案3】:

    如果你想给 awk 一个机会,这很简单:

    awk -F '"' 'NF>2{print $2}' inFile
    

    【讨论】:

      【解决方案4】:

      如果您希望grep 只返回匹配的字符串(而不是整行),您应该使用-o(或--only-matching)选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 2020-10-19
        • 2012-09-26
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        相关资源
        最近更新 更多