sedを使用して\ nを2つのパターン(パターンを除く)の間で|に変更したいと思います。
一連のアドレスを複数回含むファイルがあります。
Adress:
1540 Broadway
New York
NY 10036
United-states
###
私は欲しい:
Adress:1540 Broadway|New York|NY 10036|United-states
###
次のコード行を使用します。
sed -i "/^Adress:/!b;:a;/###/bb;$!{N;ba};:b;s/\n/\|/g;tb" file.txt
...しかし、両方のモードが含まれており、次のような誤った結果が表示されます。
Adress:|1540 Broadway|New York|NY 10036|United-states|###
代替案からパターンを除外するにはどうすればよいですか?
答え1
小さな問題に対処していない限り、この種の操作を実行するためにループを使用しないことをお勧めします。行番号1.範囲と予約済みスペースを使用する方が良いです。
sed '/Address/,/###/{
/###/!H;/Address/h;/###/!d;x;s/\n//;s/\n/|/g;G
}' infile
つまり、範囲の各行に対して次のことを行います。範囲の最後の行でない場合は、予約済みスペースに追加し(範囲の最初の行の場合は上書き)、行を削除し、それ以外の場合はバッファを置き換えます。領域から最初の埋め込み改行文字を削除し、残りをに置き換えます|
。その後、保持バッファの内容がパターン空間に追加される。
最後のエントリAddress
に従わないと失敗するので、###
これを防ぐには2番目の条件を使用し、入力の最後の行でない場合にのみ削除し、それ以外の場合は保存バッファに追加して交換して終了します。
sed '/Address/,/###/{
/###/!H;/Address/h;/###/!{
$!d;H;x;q
}
x;s/\n//;s/\n/|/g;G
}' infile
1:ドラッグする線が多いほど、パターンスペースが一致していることを常に確認する必要があるため、速度が遅くなります。結果はこちら(これは他の要件であることを知っていますが、単にアイデアを提供するためのものです...)