检查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循环语句