web-dev-qa-db-ja.com

共通の文字列「メッセージ」を使用して、特定の順序でテキストを分割します

次の内容のテキストファイルがあります

$ cat foo.txt

some text 
[email protected]
8903457923
2018-02-09 07:12 (Asia/Kolkata)
again some text over here
some more text again
Message
some text 
[email protected]
8903457923
2018-02-05 07:12 (Asia/Kolkata)
again some text over here
some more text again
Message

次の出力を取得したい

$ cat foo.txt

some text  [email protected]  8903457923  2018-02-09 07:12 (Asia/Kolkata)  again some text over her  some more text again  Message

some text [email protected]  8903457923  2018-02-05 07:12 (Asia/Kolkata) again some text over here  some more text again  Message

Trを使用し、「メッセージ」を共通の文字列として使用することで、これを実現できると思います。しかし、これを実装する方法がわかりません。

3
smc

現在の行が「メッセージ」でない場合は、OFSで結合された行をリストに追加します。 「メッセージ」が表示されたら、現在のリストを印刷します(OFSと現在の「メッセージ」行が結合されています)。

_awk '/^Message$/ { print t OFS $0 ORS; t=""; } !/^Message$/ { t=(t ? t OFS $0 : $0) }' < foo.txt
_

t=(t ? t OFS $0 : $0)部分は三項演算子です。 tが空かどうかを確認します。そうである場合は、現在の行をそれに割り当てます。それ以外の場合は、現在の値にOFSの後に現在の行を追加します。

出力:

_some text  [email protected] 8903457923 2018-02-09 07:12 (Asia/Kolkata) again some text over here some more text again Message

some text  [email protected] 8903457923 2018-02-05 07:12 (Asia/Kolkata) again some text over here some more text again Message
_
6
Jeff Schaller

aWKで少し簡単な方法:

awk 'BEGIN { ORS=RS="Message\n" } gsub("\n"," ")' ./in.txt

5
pawel7318

trsedの使用:

tr '\n' '\t' <foo.txt  | sed -e $'s/Message\\\t/Message\\\n\\\n/g'

これにより、すべての改行がタブに変換され、Messageが出現するたびに2つの改行が追加されます。

2
jesse_b

このsedを試すことができます

sed ':A;/Message/!{N;bA};y/\n/ /;$!G' foo.txt

メッセージが表示されるまで、パターン空間で行を取得します。
各改行を空白スペースに置き換えます。
最後でない場合にのみ空白行を追加します。

0
ctac_