【问题标题】:BASH: how to put variable inside regex?BASH:如何将变量放入正则表达式中?
【发布时间】:2011-08-08 11:15:21
【问题描述】:

我正在尝试使用以下代码:

searchfile="availables.txt"
read searchterm
grep_params="-i ^.*${searchterm}.*;.*$' $searchfile"
egrep $grep_params

它应该回显所有以 $searchterm 开头并后跟“;”的行。但是如果搜索词包含它不起作用的空格(例如:“黑眼豌豆”),它会给我以下输出:

egrep: eyed: No such file or directory
egrep: peas.*;.*$": No such file or directory
egrep: "availables.txt": No such file or directory

【问题讨论】:

标签: regex bash variables grep


【解决方案1】:

您要查找的代码类似于:

searchfile="availables.txt"
read searchterm
regex="${searchterm}"'.*;'
egrep "${grep_params}" "${searchfile}"

请注意,我简化了您的正则表达式(希望我做对了!)。

但是,正如 Ignacio Vazquez-Abrar 所指出的,这在复杂的情况下会失败。

【讨论】:

    【解决方案2】:

    您需要在此处控制分词。这是通过数组完成的。见http://mywiki.wooledge.org/WordSplitting

    searchfile="availables.txt"
    read searchterm
    grep_params=(-i "^.*${searchterm}.*;.*$" $searchfile)
    egrep "${grep_params[@]}"
    

    但不要使用egrep - 请改用grep -E,因为第一个已弃用。 但我会这样更改您的代码:

    searchfile="availables.txt"
    read searchterm
    grep_params="^.*${searchterm}.*;.*$"
    grep -E -i "$grep_params" $searchfile
    

    【讨论】:

    • 谢谢,还有:有什么办法可以转义所有空格、括号等?所以我可以在搜索词中输入字符串“。*”
    • 没找到你。当被要求输入searchterm 时,什么禁止你输入.*
    • 如果我输入“.*”,它匹配所有行
    • 把grep_params中的.*$去掉,就会匹配到";"
    【解决方案3】:

    由于这是正则表达式,请尝试将“”替换为\s。这代表一个空白字符。

    “黑色\seyed\speas”

    【讨论】:

    • 这也将匹配其他空白字符,这可能不是预期的。
    【解决方案4】:

    另一种方法是通过 xargs 传递参数:

    searchfile="availables.txt"
    read searchterm
    grep_params="-i '^.*${searchterm}.*;.*$' $searchfile"
    echo "$grep_params" | xargs egrep
    

    【讨论】:

      【解决方案5】:

      猛击

      searchfile="file"
      read searchterm
      shopt -s nocasematch
      while read -r line
      do
          case "$line" in
              *"$searchterm"*";"* ) echo "$line";;
          esac
      done < "$searchfile"
      

      【讨论】:

        【解决方案6】:

        我通过搜索“正则表达式中的 bash 变量”到达这里

        我通过将正则表达式分隔符从“/”更改为“+”解决了这个问题

        尽管它与 egrep 无关,但我正在为来自类似搜索的其他人添加我的解决方案:

        SYBASELOG="/opt/sybase/ASE-12_5/install/SYBASE.log"
        MAILBODY="Some text and then the replacement placeholder:
        
           [MSGFILE]
        
           and some more text"
        
        # Some proecessing...
        
        MAILBODY=`echo "${MAILBODY}" | sed -e "s+\[MSGFILE\]+"${SYBASELOG}"+"`
        

        是的,我现在看到它与 bash 几乎没有关系,而与日志文件变量中的斜杠有关。哦!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-26
          • 2015-07-24
          • 2022-01-04
          • 2013-07-13
          • 2014-08-10
          • 1970-01-01
          相关资源
          最近更新 更多