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

3

我有一个简单的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

请问能否提供一些具体的信息?
3个回答

3

[[ expr ]] 是bash中的语法,sh并不支持。

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


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

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

你原来的脚本可以简化为以下命令:

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

如果模式匹配成功,Awk将运行第一个{}代码块,其中执行print $1,然后强制Awk移动到下一行。否则,它将继续执行第二个{}代码块,该代码块仅打印该行内容。

@anubhava 我通常不会试图竞速。 - Amber
感谢您的评论!我稍微简化了一下我的脚本以便在这里发布。在检查条件后,完整的命令是echo "$string" | awk '{print $1}' | base64 -d | iconv -f UTF-8 -t KOI8-R >> outfile.txt - P.S.
@Amber:不要误会,我们三个人的回答基本上都差不多,所以我才发表了评论。 - anubhava
@Amber:我想我会做的 :) - P.S.
@P.S. 简化的一种方法是创建一个 shell 脚本,只对特定行执行所需的命令链,然后使用 awk 为相关行调用 shell 脚本 - {print $1 | "myscript.sh"; close("myscript.sh"); next}(close 确保脚本输出在任何下一行之前)。 - Amber

2
因为您在使用shebang时使用了/bin/sh,而[[仅在BASH中可用。
请将shebang更改为/bin/bash
顺便说一句,您的脚本可以完全使用简单的awk处理,不需要在while循环中使用awk。

非常感谢您指出这一点。所以如果我没有bash,我就不能使用这个条件语句吗? - P.S.
1
是的,如果你没有BASH,那么你也不能使用=〜正则表达式运算符。 - anubhava

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接