代替コマンドの 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を使用すると仮定すると、zshGNUシステムでは次のようになります。

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" -- |

関連情報