我有以下几行的文本文件
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
)来添加新行(如果有的话)($!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
但是,如果您只想每隔三行中断一次,
awk '{printf $0; printf (NR%3=="0")? "\n" : " "}' /path/to/file.txt
解释
(NR%3=="0")
:这里的条件测试行号NR
mod3
是否等于零。即它将每三个输入行打印一个换行符,否则只打印一个空格。
答案3
方法一:我们以段落模式调用 Perl-00
并设置 ORS=\n-l
并使用显式 print 启用文件读入模式-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