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
関連: