\ nをsedの改行で置き換えてください


23

GNU sed、POSIX sed、およびBSD sedの無数のオプションと混同しています。\nこれら3つのsedタイプを使用して、リテラルを改行文字に置き換えるにはどうすればよいですか?


彼らは多くの異なるものを持っています、あなたはどの部分を知りたいですか?
cuonglm

@Gnoucはっきりしていると思う。
アビナッシュラジ14

1
あなたは見ていなかったこの質問を
groxxda 14

2
foo\\nbarまたはのような入力で何をしたいfoo\\\nbarですか?
ジル 'SO-悪であるのをやめる' 14

シンプル、次の行のfoo \\はbarです。
アビナッシュラジ14

回答:


30
sed 's/\\n/\
/g'

置換文字列でreturnを押す直前のバックスラッシュに注意してください。


これはあらゆる種類のsedで機能しますか?
アビナッシュラジ14

すべきだと思う。Linuxでのみgnuバージョンを使用してテストしました。
unxnut

11
@AvinashRaj。これはPOSIXでありsed、1979年のUnix v7の元のコマンドで動作しました。それが機能しない可能性がある唯一の場所は、sed一部の削除されたbusyboxベースのもののような非POSIXの削除された実装です。これはcshでは機能しませんが、cshの問題です。
ステファンシャゼル

\\nは検索部分で使用されるので\n、replaceで使用しないのはなぜですか?前者は後者が存在することを暗示しているようです。すなわち。なぜそうではない$ echo '1\n2'|sed 's/\\n/\n/g'

この場合、\nは、リテラルであり、2つの文字として表示されることを意味します。1 nつの改行文字としてではなく、バックスラッシュの後にが続きます。したがって、バックスラッシュをリテラルにするための2つのバックスラッシュとその後n
-unxnut

9

すでにポータブルなsed答えを持っているので、sed改行を何らかの方法で操作する必要がある場合、それが最高のツールになることはめったにありません。Perlはsed、ほとんどの* nixシステムにデフォルトでインストールされており、非常に簡単にこれを処理できます。

printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'

別の非常にポータブルな選択肢はawk次のとおりです。

printf '%s\n' 'aa\nbb' | awk  '{gsub("\\\\n","\n")};1'

Solarisでは、/ usr / xpg4 / binにある標準のawkを使用することを忘れないでください。/binにあるものは歴史的なものであり、新しいスクリプトには使用しないでください。


私が言うと思いますawk(私です同様の移植性の問題がありawk、昔ながらのawknawkまたはgawk?)。実際、Solarisボックスにはバージョンがありませんgsub()。ここでの私の投票はPerlに対するものです(perl -nlawe '...'の自動動作に近いawk)。
arielCo 14

2
@arielCo:awk移植性のために、awkPOSIX準拠のバージョンを使用し、それらの機能のみを使用すれば問題ありません。Solarisでは、1つが見つかります/usr/xpg4/bin/awk
検査員14


@arielCoは実際には、awkはperl よりも移植性があります。使用しない2番目のawkアプローチは、gsub()ほぼどこでも機能するはずです。busyboxにもawk
テルドン

1
gsub()はPOSIX(gsub、SVR3.1で追加されました。POSIXawkはSVR4に基づいており、追加情報はgawkマニュアルを参照してください)、gensub()はGNU拡張機能です。Solarisでまだ/ bin / awkとして見つかった元のawkは、gsub()のサポートをサポートしていませんでしたが、マルチキャラクタFSもサポートしていませんでした。
ステファンシャゼラス

1

Holdspaceが空の場合は、次のこともできます。

sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'

...しかし、uxnutの答えはすでにより速く、より簡単であるため、好きなようにそれを使用できます。

別の無関係な可能性:

INPUT | sed -n l | while read v ; do printf "${v%?}" ; done

ただし、^ これは、ackspace、eturn、octals 、whathaveyouなど、標準的なCスタイルの\バックスラッシュエスケープをすべて変換することに注意してください。\b\r\00



-2

sedで解決策が必要です。これはすでに以下に示しています。しかし、私は別の可能性を追加したかったのです。

tr -d "\n"

1
これは何をしますか?入力からすべての改行を削除しますか?
mikeserv 14

はい、それはまったく同じものです
jpmuc

5
しかし、なぜ?それは質問と何の関係がありますか?
mikeserv 14

1
これは、質問が文字列「\ n」を実際の改行で置き換える方法を尋ねている場合、「\ n」を削除するだけです。
スプーダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.