web-dev-qa-db-ja.com

sedを使用して着信ストリームから改行文字を削除する

私はシェルスクリプトの初心者であり、SEDを使用して各行から改行文字を削除しようとしています。これは私がこれまでにやったことです:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g'

ist改行文字のみを削除します。私はどこかでこのコマンドを見つけました:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g'

ただし、「ba:イベントが見つかりません」と表示されます。

私が行った場合:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g'

それは正しい出力を提供しますが、スクリプトを実行したときにどれだけの新しいキャラクターが得られるかわからないので、より良いものを探しています。着信ストリームは、echoまたはprintfまたはスクリプト内の何らかの変数からのものです。前もって感謝します

32
nav_jan

改行を削除するには、trを使用します。

tr -d '\n'

各改行を単一のスペースに置き換える場合:

tr '\n' ' '

エラーba: Event not foundはcshから発生しています。これは、cshが履歴リストの!baに一致しようとしているためです。 !をエスケープして、コマンドを書くことができます:

sed ':a;N;$\!ba;s/\n/ /g'  # Suitable for csh only!!

しかし、sedはこのための間違ったツールであり、引用符で囲まれた文字列をより合理的に処理するシェルを使用する方が良いでしょう。つまり、cshの使用を停止し、bashの使用を開始します。

80
William Pursell

これはあなたのために働くかもしれません:

printf "{new\nto\nlinux}" | paste -sd' '            
{new to linux}

または:

printf "{new\nto\nlinux}" | tr '\n' ' '            
{new to linux}

または:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g'
{new to linux}
6
potong