【问题标题】:Bash Using Quotes in Grep/Cut Commands in ScriptsBash 在脚本中的 Grep/Cut 命令中使用引号
【发布时间】:2012-11-04 21:03:33
【问题描述】:

我有一条类似的线

grep -oP "data-context-item-title=.*.data-context-item-id" web.html | cut -d'"' -f2

我知道这条线可以正常工作,因为我在终端上使用了它,它给了我想要的输出。但是,我想将此行放在 bash 脚本中。所以到目前为止我有这个

title="$(grep -oP 'data-context-item-title=.*.data-context-item-id' web.html | cut -d'"' -f2)"

这是一个问题,因为它匹配了第一个 "(quotation) 与 cut 的 "(quotation)。有没有办法避免呢?

没有cut函数的输出是这样的

data-context-item-title="Some long title" data-context-item-id
data-context-item-title="Another very long title" data-context-item-id

请记住,我不能使用任何 sed 或 awk 命令来替换 cut。

谢谢

【问题讨论】:

    标签: bash grep cut


    【解决方案1】:

    由于您使用的是 bash,因此使用起来足够安全:

    title=$(grep -oP 'data-context-item-title=.*.data-context-item-id' web.html | cut -d'"' -f2)
    

    这将保留变量中的内部间距(尤其是换行符),您可以查看是否这样做:

    echo "$title"
    

    我认为,如果您设法找到要使用的 UNIX™ 7th 版 Bourne Shell,那么请省略 $(...) 符号周围的双引号(或者,更准确地说, `...` 表示法)并不安全,但它似乎确实可以在现代 shell 上安全地工作(比如那些最近一次更新是在当前千年,而不是在前一个)。困难在于找到一个旧的 Bourne Shell 来验证我现在摇摇欲坠(因为遥远)的记忆。

    不过,让我感到困惑的是,在 Mac OS X 10.7.5 上运行 bash 3.2(系统)和 4.2(自制)时,无论有没有双引号,您的代码对我来说都能正常工作$(...)。您使用的是哪个版本的bash,在哪个平台上?

    【讨论】:

    • 我第二个关于这是什么版本的 bash 的问题。需要明确的是:重要的问题是运行脚本的 bash 版本,它可能与交互使用的版本不同。
    【解决方案2】:

    cut 中分隔符的参数是双引号而不是单引号。使用反冲来逃避实际报价

    【讨论】:

    • 我不确定你的意思。我故意使用双引号作为分隔符。
    【解决方案3】:

    荒谬的建议:您的命令中的一个引号是否可能不是纯 ASCII 引号,而是某种 Unicode 花式引号(shell 无法识别)?

    【讨论】:

      【解决方案4】:

      首先,解决错误转义cut的双引号:

      title="$(... | cut -d \" ...)"
      

      但是,您使用的是 grep 的 PCRE,因此您可以使用环视和完全删除:

      title=$(grep -oP '(?<=data-context-item-title=").*?(?=" data-context-item-id)' web.html)
      

      【讨论】:

        【解决方案5】:

        不确定是否是拼写错误,但您似乎忘记了 $(...) 的右括号

        【讨论】:

        • 是的,这是一个错字。刚刚修好了
        • 那么第一个" 是否仍然与剪辑的" 匹配?这条线在我的机器上运行良好。
        • 是的,它仍然匹配第一个 " with cut's "。当我编写更多代码行时,它认为它们都在引号中并且从未终止。
        • 不知道为什么会这样。我复制粘贴了title=... 行,我得到“一些长标题”和“另一个很长的标题”。你确定你没有打错任何东西吗?
        • 这更适合作为评论。其他人可能会反对。祝大家好运。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        • 2023-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多