速い答え
sed ':a;N;$!ba;s/\n/ /g' file
- :a ラベル「a」を作成します
- N 次の行をパターンスペースに追加します
- $! ない最後の行場合は、BAの 枝は、ラベル「」(に行きます)
- sの 代替、/ \ N / 改行のための正規表現、/ / スペースで、/ gの グローバルマッチ(何度もそれができる限り)
sedは最後の行に到達するまでステップ1から3までループし、すべての行をパターンスペースに収め、sedはすべての\ n文字を置き換えます
代替案
すべての選択肢は、sedとは異なり、プロセスを開始するために最後の行に到達する必要はありません
bashの、遅いです
while read line; do printf "%s" "$line "; done < file
perlの、sedの様速度を
perl -p -e 's/\n/ /' file
TR、より速くsedは、1つの文字で置き換えることができる唯一の
tr '\n' ' ' < file
pasteを使用すると、trのような速度で、1文字だけで置き換えることができます
paste -s -d ' ' file
awkは、TR様の速度
awk 1 ORS=' ' file
"echo $(<file)"のような他の代替方法は遅く、小さなファイルでのみ機能し、ファイル全体を処理してプロセスを開始する必要があります。
5.10。エスケープ
シーケンス\ nを使用して改行を一致または削除できないのはなぜですか?\ nを使用して2行以上を一致させることができないのはなぜですか?
行が
パターンスペースに配置される前に改行が常に削除されるため、\ nは改行の終わりで改行と一致しません。2つ以上の行をパターンスペースに入れるには
、「N」コマンドまたは類似のコマンド(「H; ...; g;」など)を使用します。
Sedは次のように機能します:sedは一度に1行を読み取り、
終了する改行を切り取り、残されたものをパターンスペースに置き
、sedスクリプトがアドレス指定または変更できるようにし、パターンスペース
が印刷されると、改行をstdoutに追加します(またはファイルに)。場合
パターンスペースが完全にまたは部分的に「D」又は「D」で削除され、
改行がされないような場合に添加します。したがって、次のようなスクリプト
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
行がパターンスペースに配置される前に末尾の改行が削除されるため、動作しません
。上記のタスクを実行するには、
代わりに次のいずれかのスクリプトを使用します。
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
GNU sed以外のsedのバージョンに
はパターンバッファーのサイズに制限があるため、ここではUnix 'tr'ユーティリティをお勧めします。
ファイルの最後の行に改行が含まれている場合、GNU sedは
その改行を出力に追加しますが、その他はすべて削除しますが、trは
すべての改行を削除します。
2行以上のブロックを照合するには、3つの基本的な選択肢があります。
(1)「N」コマンドを使用して、次の行をパターンスペースに追加します。
(2)「H」コマンドを少なくとも2回使用して現在の行
をホールドスペースに追加し、
x、g、またはGを使用してホールドスペースから行を取得します。または(3)アドレス範囲(上記のセクション3.3を参照)を使用して
、2つの指定されたアドレス間の行を一致させます。
(1)と(2)を選択すると、パターンスペースに\ nが挿入され、
必要に応じてアドレス指定できます( 's / ABC \ nXYZ / alphabet / g')。
「N」を使用して行のブロックを削除する1つの例は、セクション4.13に記載されています
(「特定の連続する行のブロックを削除するにはどうすればよいですか?」)。この
例は、削除コマンドを
「p」(印刷)、「i」(挿入)、「c」(変更)、「a」(追加)、
または「s」(置換)などの別のものに変更することで変更できます。。
選択肢(3)は、\ nは、パターンスペースに入れていないだろうが、それはない
、それはあなたがいないのかもしれので、連続した行のブロックと一致して
も、あなたが探しているものを見つけるために、n個\必要があります。GNU sed
バージョン3.02.80 以降、次の構文がサポートされています。
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
従来の「/ from here /、/ to there / {...}」の範囲
アドレスに加えて、\ nの使用を完全に回避することが可能な場合があります。
tr
上記の例では、改行をスペースに置き換えていますが、1つの文字を1つの文字に置き換える場合にのみ、ジョブに適したツールです。上記の例では、trは機能しますが、後で制限されます。