【问题标题】:How to pass a variable from bash to regex如何将变量从 bash 传递到正则表达式
【发布时间】:2014-08-10 10:42:38
【问题描述】:

我试图只打印包含变量 $foo 的行。我试过使用双引号和花括号无济于事。在 sed 中将 shell 变量传递给正则表达式的正确方法是什么?

sed -n 's:\("${foo}".*$\):\1:p' file.txt

【问题讨论】:

  • 你确定你的问题是传递变量吗?当你使用字面值时,你是否验证过匹配?
  • 单引号防止变量替换。你需要做这样的事情:sed -n 's:\('"${foo}"'.*$\):\1:p' file.txt。在该行上使用 echo 来查看(或多或少)发生了什么。

标签: regex bash sed sh


【解决方案1】:

使用单引号可以得到类似

的结果
$-pattern='foo'
$-sed 's/('$pattern'.*$)/<\1>/g'
  fo
  fo
  foo
  <foo>

【讨论】:

    【解决方案2】:

    sed 如果您实际上不需要修改匹配的行,那就大材小用了。只需使用grep

    grep "$foo" file.txt
    

    【讨论】:

      【解决方案3】:

      尝试下面的 sed 命令打印包含分配给变量 foo 的值的行。

      sed -n "/$foo/p" file
      

      【讨论】:

      • +1 表示正确的 sed 命令,-1 表示使用错误的工具。你看,没有人说$foo 变量不包含任何特殊字符。你知道如果像/ 这样的东西进入$foo 会发生什么。 grep 解决方案不存在这样的问题。
      • @Aleks-DanielJakimenko 好点。但是 op 想要一个 sed 解决方案。所以我发布了它。而且如果变量包含特殊字符,那么他为什么选择 sed 来打印相应的行。
      • 这就是我没有投反对票的原因 :) 但有时人们要求错误的东西,而给他们一个答案只会让事情变得更糟。
      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 2017-10-24
      • 2020-01-04
      • 2020-06-09
      • 2017-09-11
      • 2011-08-08
      • 2013-07-13
      • 2012-01-24
      相关资源
      最近更新 更多