次のようにファイルを作成しました。
printf 'this is \n not is \n is is \n this biz' > file2
\ n(newline)をすべて削除しようとすると、sed自体から挿入された数字の改行文字のみが削除されます。
sed '=' file2 | sed 'N; s/\n/ /'
出力は次のとおりです
1 this is
2 not is
3 is is
4 this biz
私が期待していたものの代わりに:
1 this is 2 not is 3 is is 4 this biz
わかりません。
ベストアンサー1
2番目のsed
スクリプト、
N
s/\n/ /
行を読み、次にコマンドで挿入された新しい行を含む行に次の行を追加してから、改行を空白N
(および出力)に置き換えるため、期待どおりに機能しません。後続の行を読み取ると、最初の2行の結果が削除されます。
代わりに予約済みスペースを使用する必要があります。
H; # append to hold space with a '\n' embedded
# for the last line:
${
x; # swap in the hold space
s/\n//; # delete the first newline (from the H command on the very first line of input)
y/\n/ /; # replace all other newlines with spaces
p; # print result
}
スクリプトは各入力行に対して一度実行され、最後の行に達するまで予約済みスペースにデータを収集します。最後の行では、収集したデータを処理して出力します。
次のコマンドを使用して実行できますsed -n
。
$ sed '=' <file2 | sed -n 'H; ${ x; s/\n//; y/\n/ /; p; }'
1 this is 2 not is 3 is is 4 this biz
(入力端に改行文字がないため、出力端に改行文字もありません.)
または、明示的なループを使用してを使用できますN
。ここで重要なのは、結果を印刷する準備が整う前にスクリプトの終わりに達しないことです。
:top; # define label 'top'
N; # append next line with a '\n' embedded
$!btop; # if not at end, branch to 'top'
y/\n/ /; # replace all newlines with spaces
# (implicit print)
このスクリプトは(最後まで)一度だけ実行され、データ自体の読み取りを管理しますが、古いスクリプトは組み込みの読み取りループを介してデータを提供しましたsed
(ここではパターン空間の変更これは、読み取るすべての行の問題です。データを収集して最後の行を読み取るときに処理するために、ホールドスペースの代わりにパターンスペースを使用します。
コマンドラインから:
$ sed '=' <file2 | sed ':top; N; $!btop; y/\n/ /'
(上記と同じ出力)