sed:匹配两行


11

我有一个文本文件,其中记录分为两行。我想将它们放在一行上。记录如下所示:

2013-07-29
 apt-get install git
2013-07-29
 apt-get install rsync
2013-07-31
 apt-get install nmap
2013-08-02
 apt-get install cifs-utils
2013-08-05
 apt-get install telnet

我想得到以下内容:

2013-07-29 apt-get install git
2013-07-29 apt-get install rsync
2013-07-31 apt-get install nmap
2013-08-02 apt-get install cifs-utils
2013-08-05 apt-get install telnet

我尝试使用sed,但无法匹配两行。有技巧sed吗,还是有更好的工具?


您似乎不太希望匹配两行,而更多的是希望在找到匹配项后加入该行。是?
kurtm 2013年

Answers:


13
sed 'N;s/\n/ /'
  • N 将下一条输入线连接到图案空间
  • s/\n/ / 替换用行分隔行的换行符。

要么:

sed -n 'N;s/\n/ /;/regex/p'
  • -n 禁用自动打印图案空间作为最后一个命令
  • /regex/p 打印与正则表达式匹配的行

g如果要连接两条以上的线,请使用修饰符进行替换,例如N;N;N;s/\n/ /g


要记住的一点:sed可以在线工作! 我花了sed 's/>\n</>,</'很长时间尝试去上班,直到我意识到sed一次可以在线工作。快速的duckduckgo搜索和@peterph让我保留了其余的头发
Northern-bradley

6

似乎这些apt-get行前面有一个空格。说:

sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D' inputfile

应该产生期望的结果。

另外,您也可以使用paste

paste -d' ' - - < inputfile
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.