检查while循环内的正则表达式条件(shell)

Posted

技术标签:

【中文标题】检查while循环内的正则表达式条件(shell)【英文标题】:Check regexp condition inside while loop (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

你能告诉我吗?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于检查while循环内的正则表达式条件(shell)的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程Shell中for循环while循环until循环语句

linuxlinux 基础正则表达式字符串截取比较分支while循环

shell脚本

shell脚本while循环语句

for 循环与while循环的区别

shell脚本的使用---while循环