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 单词边界,如果您位于单词的开头或结尾,它将匹配。它会在您的情况下(在大多数情况下)产生完全相同的结果,并且未来的维护者将更有可能熟悉它,而不是经历您刚刚经历的斗争。
我有以下代码可以在 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 单词边界,如果您位于单词的开头或结尾,它将匹配。它会在您的情况下(在大多数情况下)产生完全相同的结果,并且未来的维护者将更有可能熟悉它,而不是经历您刚刚经历的斗争。