sedは次のスクリプトを並列に実行しているようですが、順番に実行したいと思います。
printf '%s\n' aa bb cc dd | sed 's/bb/\nff/g;/^$/d'
この sed スクリプトは bb を ff に置き換え、空行を削除しながら改行を追加します。
改行文字を追加し、追加した改行文字を削除したいとします。
答え1
sed
sed
通常、ファイルは一度に1行ずつ処理されますが、改行が追加された場合(または「パターンスペース」の内容を読み取ったり追加したりするいくつかのコマンドが使用されている場合)、同時に複数行を含めることができます。特に、sed
スクリプトが " bb
"行を処理するときは、最初にこれを " \nff
"(\n
実際の改行文字を表す)に置き換えてから、パターン空間全体をregexと比較して^$
一致しないことを見つけて、コマンドを無視します。 (注:この場合とは、^
行$
の始まりと終わりを意味するのではなく、パターン空間の始まりと終わりを意味します。)
解決策:目標を正しく理解したら、2番目のテストでは^\n
改行文字()で始まるパターンスペースを確認する必要があり、そうであれば改行文字(いいえ全体パターン空間)。を交換してこれを行うことができますs/^\n//
。
デフォルトでは、「bb」パターンが行の先頭にある場合は改行文字が追加されますが、行の末尾にある場合は改行文字は追加されません。
$ printf '%s\n' aa bb cc dd prefixbbsuffix | sed 's/bb/\nff/g;s/^\n//'
aa
ff
cc
dd
prefix
ffsuffix
あるいは、2つの別々のsed
コマンドを実行することができるので、2番目のコマンドは追加された行を別々の項目として処理して行を再作成します。
printf '%s\n' aa bb cc dd prefixbbsuffix | sed 's/bb/\nff/g' | sed '/^$/d'
aa
ff
cc
dd
prefix
ffsuffix
これが実際の目標ではない場合は、質問を編集して明確にしてください。