このコマンドを実行すると
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様シェルを使用している場合は、最初の行print
($sourceDir
で始まらないと仮定-
)を次に置き換えることができます。
LC_ALL=C find "${sourceDir%/}/" -maxdepth 1 ! -name '.*' -type f -print0 |
または最初の2行:
LC_ALL=C find "${sourceDir%/}/" -maxdepth 1 ! -name '.*' -type f \
-exec grep -lZFe "$origText" -- |