【问题标题】:Check regexp condition inside while loop (shell)检查while循环内的正则表达式条件(shell)
【发布时间】:2013-11-10 11:30:36
【问题描述】:

我在运行简单的 shell 脚本时遇到问题,我在其中使用 while 循环读取文本文件并尝试使用匹配的正则表达式检查条件:

#!/bin/sh
regex="^sometext"


cat input.txt | 
{
  while read string
    do if [[ $string ~= $regex ]]; then
            echo "$string" | awk '{print $1}' >> output.txt
       else
            echo "$string" >> outfile.txt
       fi
    done
}

但我只收到像

这样的错误
[[: not found

你能告诉我吗?

【问题讨论】:

    标签: regex shell loops if-statement while-loop


    【解决方案1】:

    因为您将 shebang 用于 /bin/sh,而 [[ 仅在 BASH 中可用。

    把shebang改成/bin/bash

    顺便说一句,您的脚本可以在简单的 awk 中完全处理,您无需在此处的 while 循环中使用 awk

    【讨论】:

    • 非常感谢您指出这一点。所以如果我没有 bash 我不能使用这个条件?
    • 是的,如果您没有 BASH,那是正确的,那么您也不能使用 =~ 正则表达式运算符。
    【解决方案2】:

    [[ expr ]] 是一种 bash 主义; sh 没有。

    如果您想使用该语法,请使用 #!/bin/bash


    也就是说,为什么要使用 shell 脚本?

    Awk 已经可以完成您在这里所做的一切 - 您只需利用 Awk 的内置正则表达式匹配和每行具有多个操作的能力:

    您的原始脚本可以简化为以下命令:

    awk '/^sometext/ {print $1; next} {print}' input.txt >> output.txt
    

    如果模式匹配,Awk 将运行第一个{}-block,它执行print $1,然后强制Awk 移动到下一行。否则,它将继续到第二个{}-block,它只打印该行。

    【讨论】:

    • @anubhava 我一般不参加比赛。
    • 感谢您的评论!我稍微简化了我的脚本以在此处发布。检查条件后的完整命令是echo "$string" | awk '{print $1}' | base64 -d | iconv -f UTF-8 -t KOI8-R >> outfile.txt
    • @Amber:别以为这样,我们三个人的回答都差不多,这就是我发表评论的原因。
    • @Amber:我想我会的 :)
    • @P.S.一种简化的方法是制作一个 shell 脚本,它只执行您想要在特定行上执行的命令链,然后使用 awk 仅为相关行调用 shell 脚本 - {print $1 | "myscript.sh"; close("myscript.sh"); next}(关闭确保脚本的输出在任何下一个打印行之前)。
    【解决方案3】:

    sh 不支持双括号语法 - 这是明确的 bash-ism。

    尝试将您的 shebang 线路更改为 #!/bin/bash

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-04
      • 2015-03-23
      • 2017-04-03
      • 2020-10-05
      • 2019-11-23
      • 2016-01-22
      • 1970-01-01
      • 2013-04-20
      相关资源
      最近更新 更多