web-dev-qa-db-ja.com

sedがMacでの改行の正しい代替操作を提供しない-GNU sedとBSD / OSX sedの違い

私はこのリファレンスを使用しています: sedヘルプ:リテラル "\ n"(改行ではありません)のマッチングと置換

そして、文字列hello\ngoodbyeを含むファイル「test1.txt」があります。

このコマンドを使用して、「\ n」を検索し、実際の改行文字で置き換えます。

sed -i '' 's/\\n/\n/g' test1.txt

しかし結果は:hellongoodbyeです。 「\ n」を「n」に置き換えるだけで、実際の改行ではありません。これは、タブではなく「t」を残す/ tと同じです。

''はMACの未定義のエラーです: http://mpdaugherty.wordpress.com/2010/05/27/difference-with-sed-in-place-editing-on-mac-os-x -vs-linux /

更新

私は@ hek2mglが提案した両方のコマンドを試しました:

sed -i 's/\\n/\n/g' test.txt
# Or:
sed -i'' 's/\\n/\n/g' test.txt

Linuxでは動作する可能性がありますが、MAC OSでは次のエラーが発生しました。

sed: 1: "test1.txt": undefined label 'est1.txt'

これが機能しない理由がわかりません。前もって感謝します。

16
Brandon Ling

これは少し奇妙に見えるかもしれませんが、以下を試してください。

sed -i '' 's/\\n/\
/g' test1.txt

つまり、\nの代わりにactual改行を使用します。

説明はあなたが奇妙なsedを持っているということです!詳細については、mac sedマニュアルを参照してください。 https://developer.Apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sed.1.html

そこのsコマンドの説明には、次のように書かれています。

A line can be split by substituting a newline character into it.  To specify
a newline character in the replacement string, precede it with a backslash.

また、-iオプションの説明では、拡張子はオプションではなく、必要ない場合は空の引数を指定する必要があることを示しています。結局のところ、すべてが理にかなっています!

5
ooga