次の行を含むテキストファイルがあります。
From: arkit Corp. <[email protected]>
Sent: Friday, June 16, 2017 6:35 PM
To: User Name
Subject: arkit Corp.: activity alert.
<http:// arkit.co.in/>
ACTIVITY ALERT FOR:
Ravi
https:// arkit.co.in/ Path Read (03/07/2017)
Path: /website/upload/file.txt
https:// arkit.co.in/ Path Read (04/07/2017)
Path: /website/upload/file1.txt
Copyright ▒ 2017 arkit Corp.. All Rights Reserved.
次のように印刷したいと思います。
https:// arkit.co.in/ Path Read (03/07/2017) Path: /website/upload/file.txt
https:// arkit.co.in/ Path Read (04/07/2017) Path: /website/upload/file1.txt
並べて印刷する方法を提案できる人はいますか?
答え1
メッセージ全体を解析するには、次のように「アドレス」を使用します。
sed -n '/https:/h;/Path:/{H;g;s/\n/ /p;}' yourfile
デフォルトでは出力されません(-n
)。それで始まる行をhttps:
メンテナンスバッファに入れてから、Path:
その行をメンテナンスバッファに追加し、パターン空間に移動し、改行を空白に置き換えます。
または他の方法:
sed -e '/^https:/!d;:a' -e '$!N;/Path:/!ba' -e 's/\n\n*/ /' yourfile
つまり、行がhttps:
()で始まらない場合は削除してください/^https:/!d
。それ以外の場合は、行を追加するまでループ(:a
)を開始して新しい行(存在する場合)を追加します()。 。最後に、すべてを1行に入れるために、改行を空白に置き換えます()。$!N
Path:
/Path:/!ba
s/\n\n*/ /
答え2
オプション1
空行を壊したい場合は、
awk '{printf $0; printf ($0=="")? "\n" : " "}' /path/to/file.txt
説明する
printf $0
:現在行を印刷します(改行なし)。printf ($0=="")? "\n" : " "
:現在行が空の場合は($0=="")?
改行文字を印刷し"\n"
、そうでない場合は空白を印刷します" "
。- これにより、最後の行に末尾のスペースが印刷され、これが問題になる可能性があります。
オプション2
しかし、3行目だけを切りたい場合は、
awk '{printf $0; printf (NR%3=="0")? "\n" : " "}' /path/to/file.txt
説明する
(NR%3=="0")
:ここの条件は、行番号NR
modが3
0かどうかをテストします。つまり、3行の入力行ごとに改行文字を印刷し、それ以外の場合は空白のみを印刷します。
答え3
方法1:短絡モードでPerlを呼び出し-00
、ORS = \ nを設定し、-l
明示的な印刷を使用してファイル読み取りモードを有効にします-n
。 https://で始まる現在のレコードを選択し、$_
そのレコードの終わりに次のレコードを埋めます<>
。最後に、追加された現在のレコードの改行文字は削除され、残りは標準出力として印刷されます。 ORSは現在のレコードに追加されます。
perl -ln -00e 's/$/$".<>/e and print tr/\n//dr if m|^https://|' file.txt
この方法では、https://行が見つかった場合はループを設定し、見つかった空の行を空でない最初の行に追加し続けます。その間、私たちは空の行を削除し続けます。
sed -ne '
\|^https://|!d
:loop
N
s/\n$//
tloop
s/\n/ /p
' file.txt
出力
https:// arkit.co.in/ Path Read (03/07/2017) Path: /website/upload/file.txt
https:// arkit.co.in/ Path Read (04/07/2017) Path: /website/upload/file1.txt