このコマンドはなぜ他のすべての行でのみ機能しますか?

このコマンドはなぜ他のすべての行でのみ機能しますか?

私が実行すると、\ls | xargs -I {} echo {} | sed 'N;s/\n/xxxxxxxxx/'次のような結果が得られます。

- Books aliasxxxxxxxxxA New Kind of Science
Computability-and-Logic.pdfxxxxxxxxxComputability-and-Logic_k2opt.pdf
Hein J. L. - Prolog Experiments in Discrete Mathematics, Logic, and Computability (2005).pdfxxxxxxxxxHein J. L. - Prolog Experiments in Discrete Mathematics, Logic, and Computability (2005)_k2opt.pdf
How Automated Recommendations Affect the Playlist Creation Behavior of Users.pdfxxxxxxxxxHow Automated Recommendations Affect the Playlist Creation Behavior of Users_k2opt.pdf
Lumanote- A Real-Time Interactive Music Composition Assistant.pdfxxxxxxxxxgeMsearch- Personalized Explorative Music Search.pdf
research_report_dc_02.pdfxxxxxxxxxresearch_report_dc_02_k2opt.pdf
thebookofshaders.pdfxxxxxxxxxthebookofshaders_k2opt.pdf

出力が次のような理由を理解できません。

- Books aliasxxxxxxxxxA New Kind of SciencexxxxxxxxxComputability-and-Logic.pdfxxxxxxxxxComputability-and-Logic_k2opt.pdfxxxxxxxxxHein J. L. - Prolog Experiments in Discrete Mathematics, Logic, and Computability (2005).pdfxxxxxxxxxHein J. L. - Prolog Experiments in Discrete Mathematics, Logic, and Computability (2005)_k2opt.pdfxxxxxxxxxHow Automated Recommendations Affect the Playlist Creation Behavior of Users.pdfxxxxxxxxxHow Automated Recommendations Affect the Playlist Creation Behavior of Users_k2opt.pdf

答え1

$ seq 10  | sed 'N;s/\n/+/'
1+2
3+4
5+6
7+8
9+10

Nパターンスペースに次の行を追加し、s2つの行を結合して+からsedその行を印刷し、次の入力行(行3と4が+結合される場所)のスクリプトを繰り返します。

あなたはする必要があります

$ seq 10 | sed 'N;N;N;N;N;N;N;N;N;s/\n/+/g'
1+2+3+4+5+6+7+8+9+10

または、sedスクリプトでループを使用してすべての行を連結します。

$ seq 10 | sed -e :1 -e '$!N;s/\n/+/;t1'
1+2+3+4+5+6+7+8+9+10

入力全体がパターン空間に吸収されるため、大容量ファイルに合わせて拡張されません。

文字区切り文字を使用して行を連結するには、以下を使用できますpaste

$ seq 10 | paste -sd + -
1+2+3+4+5+6+7+8+9+10

入力全体をメモリにロードしないマルチ文字区切り文字の場合:

$ seq 10 | awk -v sep=-+- -vORS= 'NR>1 {print sep}; 1; END {if (NR) print RS}'
1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-+-9-+-10

答え2

コメント付きのスクリプトsed:

# Append the next line of input to the pattern space with an embedded newline
N

# Replace the embedded newline with the string xxxxxxxxx
s/\n/xxxxxxxxx/

# (implicit print, start next cycle, overwriting the pattern space with the next line)

したがって、1行を読み、1行を追加し、置換+出力を実行します。次に3行目を読み、4行目を追加して+出力を置き換えます。

集めたいならみんな2つの方法でこれを行うことができますsed

  1. 明示的なループを使用してください: :top; N; $!btop; s/\n/xxxxxxxxx/g「次の行を追加し、まだ終わっていない場合は再度実行し、すべての改行を置き換えます」。

  2. 予約済みスペースの使用:1{h;d;}; H; ${x;s/\n/xxxxxxxxx/g;p;}; dつまり、「最初の行を予約済みスペースにコピーし、入力から削除し、他のすべての行もそこに追加して入力から削除します。ただし、最後の行に達すると予約済みスペースを置き換えて改行そして結果を印刷します。」

この2つの方法の主な違いは、最初の方法は最後まで最初のループを終了せずにパターン空間に文字列を作成することですが、2番目の方法は入力の各行に対して最後まで実行し、結果を保持スペースに蓄積することです。 。


それを見るもう一つの方法はを使用することですawk

あなたのsedコードは本質的に

awk '{ line = $0; getline; print line "xxxxxxxxx" $0 }'

あなたが望むもの

awk '{ line = (line == "" ? $0 : line "xxxxxxxxx" $0 ) } END { print line }'

これは使用中の予約済みスペースをシミュレートしますsed

または、

awk '{ line = $0; while (getline > 0) line = line "xxxxxxxxx" $0; print line }'

これは明示的なループを使用してシミュレートされますsed

答え3

これは、sedが1行ずつ処理するために発生します。次のように繰り返す必要があります。sed -e ':again' -e 'N;s/\n/xxxxx/' -e 'tagain'または、より簡単な方法は、次のように使用することです。tr "\n" "xxxxx"

関連情報