2つのパターンの間でsedを使用して「\ n」を「|」に変更します(パターンを除く)。

2つのパターンの間でsedを使用して「\ n」を「|」に変更します(パターンを除く)。

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:ドラッグする線が多いほど、パターンスペースが一致していることを常に確認する必要があるため、速度が遅くなります。結果はこちら(これは他の要件であることを知っていますが、単にアイデアを提供するためのものです...)

おすすめ記事