替代命令中的 sed 错误标志:“n”

替代命令中的 sed 错误标志:“n”

当我运行这个命令时

for file in $sourceDir
do
   sed -i s/$origText/$newText/g $file
done

它给了我这个错误:

bad flag in substitute command: 'n'

答案1

最有可能的是$origText,或$newText包含一个/后跟的n,但您将/其用作正则表达式和替换之间的分隔符。您需要对其进行转义或使用变量中未出现的分隔符。但还有很多其他角色你需要逃脱

它会更容易使用perl(其中一些实现首先sed借用了非标准扩展),可以更轻松地替换任意字符串。-i

您可能还只想重写$origText最初包含的文件。

假设您没有引用变量但仍然使用类似 Bourne 的for循环,我假设您正在使用 shell zsh,那么在 GNU 系统上,应该是:

print -rNC1 -- "$sourceDir"/*(N.) |
  xargs -r0 grep -lZFe "$origText" -- |
  L="$origText" R="$newText" xargs -r0 perl -pi -e '
    s/\Q$ENV{L}\E/$ENV{R}/g' --

如果使用另一个类似 POSIX 的 shell,您可以将第一print行(假设$sourceDir不以 开头-)替换为:

LC_ALL=C find "${sourceDir%/}/" -maxdepth 1 ! -name '.*' -type f -print0 |

或者前两行:

LC_ALL=C find "${sourceDir%/}/" -maxdepth 1 ! -name '.*' -type f \
  -exec grep -lZFe "$origText" -- |

相关内容