BSDを使用してくださいsed
。
次の置換をどのように実行できますか? :
今後:
hello hello hello
hello hello hello
後ろに:
hello world hello
hello hello hello
つまり、どのように交換できますか?これ 窒素仕事 発生するパターン?
(またはこの場合。これ 2ND 発生するパターン? )
答え1
すべてのPOSIXの場合sed
:
$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
最初のゲームが終わった後、
/hello/
私たちは混乱を続けました。ループ内で各ext行をパターン空間に読み込み、
:1
ndN
が発生した場合にのみ置換コマンドを実行しますs
。交換が成功したかどうかを見てみ2
ましょう。t
そうであればループが発生し:2
、そうでなければループが繰り返されますb1
。ループ内では、
:2
ファイルの最後まで残りの行を印刷します。
このメソッドは、2つの間のすべてを保存します。こんにちはパターン空間で。これは、最初のファイルと2番目のファイルが互いに離れている場合、大容量ファイルで問題になります。
答え2
2つのsを使用すると簡単になりますsed
。実はこんなことがたくさんあり、しばしば急いで少なくともこれはマルチコアシステムでは本当です。
: infile =;<<"" \
sed -e's/$/ /;s/hello/&\n\n/g' -e'# marks lines with " $" and splits matches' |
sed -e:n -e's/ $//;t' -eG -e'# sets up a test label, branches for " $"' \
-e's/o\n\{20\}$/o world/' -e'# stacks a byte per match, edits nth match' \
-e'x;N;x;N;s/\n\n*//;tn' -e'# completes the stacking; recycles to top' \
>outfile
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello world hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
(BSDの場合、sed
右の代替フィールドのエスケープ文字をリテラル改行文字に置き換える必要がありますn
。)\n
フローの調整は通常、フローエディタを調整するよりも簡単です。上記のシーケンスはまさにそのことをします。入力のすべての行全体を末尾の空白としてマークしますが、そうでない場合は、各発生ごとに出力行を分割します。hello
。次に、2行目はsed
スタック数を増やす必要があることを知るために空白で終わらない行を見つけ、20行目と明示的に一致する必要があります。
もちろん、それほど厳しい必要はありません。君は先頭をあきらめてもいいo
前に\n\{20\}$
交換を維持してください。それは単に置き換えるだけです~から20番目の一致から入力の最後の一致までです。または\n\{20,25\}
、一連の一致を処理することもできます。偶数:\n\{20,25\}\(\n\{15\}\)*$
20,25の範囲とそれ以降の10,15回発生ごとに処理します。
以下は、最後に述べたのと同じ入力を提供する出力の例です。
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello world hello world hello world hello world hello world hello world hello hello
hello hello hello hello hello hello hello hello world hello world
hello world hello world hello world hello world hello hello hello hello hello
hello hello hello hello hello world hello world hello world hello world hello world
hello world hello hello hello hello hello hello hello hello