当我运行这个命令时
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" -- |