Sed 语法差异 MacOS 与 GNU

Sed syntax difference MacOS vs GNU

我有以下代码可以在 MacOS 上完美运行,但不能在 GNU 上运行(我使用的是 MinGW):

filename=
iter_count=$((${#src_op_lst[@]} -1))
for i in $(eval echo "{0..$iter_count}");do
    echo "Checking File :" $filename
    sed -i "" "s/[[:<:]]"${src_op_lst[$i]}"[[:>:]]/"${tgt_op_lst[$i]}"/g" $filename
done

我想原因是 sed 语法不同,但我不知道如何让它在 GNU 上工作。我尝试使用 sed -i -e ...,但 sed 给我以下错误:-e expression #1, char 50: Invalid character class name.

我是 bash 脚本编写的新手,如果这个问题很愚蠢,请原谅。任何帮助将不胜感激!

[[:<:]][[:>:]] 是 MacOS 的 sed 解释为定向 word-boundaries 的标记:第一个让你检查你是否在单词的开头匹配第二个在单词的末尾。
这些可以让您确保替换整个单词而不是部分单词(例如,当您尝试将 pro 替换为 con 时,避免将 professor 更改为 confessor ).

GNU sed 中的确切等价物是 \<\>

但是,作为熟悉正则表达式但不一定熟悉无数不同实现的人,我建议您使用更常见的 \b 而不是 \<\>
这是一个 direction-less 单词边界,如果您位于单词的开头或结尾,它将匹配。它会在您的情况下(在大多数情况下)产生完全相同的结果,并且未来的维护者将更有可能熟悉它,而不是经历您刚刚经历的斗争。