循环中检查正则表达式条件(shell)

时间:2013-10-30 17:31:52

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

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

#!/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
你可以告诉我吗?

3 个答案:

答案 0 :(得分:3)

[[ expr ]]是一种抨击; sh没有它。

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


那说,为什么要使用shell脚本?

Awk已经完成了你在这里所做的一切 - 你只需要利用Awk的内置正则表达式匹配以及每行多个动作的能力:

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

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

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

答案 1 :(得分:2)

因为您在/bin/sh使用shebang而[[只能在BASH中使用。

将shebang更改为/bin/bash

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

答案 2 :(得分:1)

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

尝试将shebang行更改为#!/bin/bash