【问题标题】:Bash merge two specific lines into one [duplicate]Bash将两条特定的行合并为一条[重复]
【发布时间】:2019-07-22 13:40:23
【问题描述】:

我有一个包含两行重复出现的文件。

line1
     line2
line1
     line2
line1
     line2

我想合并它们,使输出文件看起来像:

line1 line2
line1 line2
line1 line2

很遗憾,我没有成功。 在记事本++中,我可以执行以下操作:

search: (line1)(\r\n)
replace: \1

在这里我也想做同样的事情,但是这个:

sed -E 's/(line1)(\n)/\1/' my_file

没用

【问题讨论】:

  • 您需要 sed 中的 N 命令来执行此操作:sed '{N;s/line1\n/line1/;} 请参阅 stackoverflow.com/questions/7852132/sed-join-lines-together
  • sed -Ez 's/(line1)\r?\n/\1/' my_file 可能对你有用(使用 GNU sed)
  • @WiktorStribiżew 不幸的是它没有。
  • sed 'N;s/line1[[:space:]]*/line1 /' my_file 也可以从 line2 中删除多余的前导空格。

标签: regex bash perl sed


【解决方案1】:

您可以为此使用pastetr

cat file | paste -d" " - - | tr -s ' '

line1 line2
line1 line2
line1 line2

【讨论】:

  • 这一行只合并了前两行。其余的保持不变。不过还是谢谢你。
  • 你是什么意思?它将遍历整个文件并在一行上打印交替行。您可以使用 paste -d" " - - - 将每 3 行打印到 1 行,依此类推。
  • 好吧,比它有效。有没有办法不指定破折号?不能到文件本身的末尾吗?
  • 不,这是命令的一部分 - - 是 2 行 - - - 是 3 行 - - - - 是 4 行等等。
  • 哦,现在我明白了。它一直在工作,我忘了提到的是我之间有空行,因此我认为它坏了。现在我觉得我最喜欢你的回答了。
【解决方案2】:

sed 不匹配。您可以在 slurp 模式下使用perl

perl -0777 -pe 's/(line1)\R+\h+/$1 /g' file

line1 line2
line1 line2
line1 line2
line1 line2

【讨论】:

  • 太棒了,这正是我想要的。 sed 真的没有任何标志或东西来匹配整行吗?
  • line1和line2之间有四个空格
  • @Z.Szymon:使用 sed 你可以做到:sed -E 'N;s/(line1)\n/\1/;' file
  • @AlfredE.Noobman:谢谢,我忽略了有问题的空间删除要求,现在已修复。
  • @Z.SzymonL 那你可能需要perl -0777 -pe 's/(line1)R+\h+/$1 /g' file
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 2012-05-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多