sed インラインと拡張正規表現が一緒に機能しない

sed インラインと拡張正規表現が一緒に機能しない

macOS 10.14.3(18D109)でsedを使用して拡張正規表現を置き換えようとしています。拡張正規表現を使用しない場合、インラインフラグが機能します。それ以外の場合、ファイルは更新されませんが -i フラグがない場合、正しい結果がコンソールに出力されます。なぜこれが起こり、どのように解決するのですか?

$ echo "foo" > foo.txt
$ sed -i -E 's/fo{1,}/123123/g' ./foo.txt

何もしません。

$ sed -E 's/fo{1,}/123123/g' ./foo.txt
123123

答え1

sedドキュメントを内部で編集するために使用される場合(sedこの機能をサポートする実装を使用して)、コンソールに出力がありません。ファイルは編集スクリプトに従って変換されます。

$ echo "foo" >foo.txt
$ sed -i -E 's/fo{1,}/123123/g' ./foo.txt
$ cat foo.txt
123123

FreeBSDおよびmacOSで-i提供sedされている実装のフラグはGNUとは異なる意味を持ち、コマンドは元のファイルのバックアップと呼ばれるファイルを生成します(したがって、このオプションはsed意図した効果はありません)。一緒に使うfoo.txt-E-E-iいいえサフィックスをバックアップするには:

sed -i '' -E ...

FreeBSD/macOSの例:

$ echo "foo" >foo.txt
$ sed -i '' -E 's/fo{1,}/123123/g' ./foo.txt
$ cat foo.txt
123123

関連:

関連情報