替换以模式开头的行末尾的新行

替换以模式开头的行末尾的新行

我的 Ubuntu 机器上有一个文件,我使用“@”标记了某些行的开头:

@A
bbb
@B
bbb
@D
ccc

我想删除以“@”开头的行末尾的新行,这样上面的文件就变成了

@Abbb
@Bbbb
@Dccc

我可以使用 sed 匹配以 @ 开头的行:

sed /^@/ ...

但我在试图找到删除字符串末尾的换行符的方法时迷失了。必须有一种方法可以轻松使用,而sed无需在文本编辑器中手动打开文件并自己删除它们。

答案1

$ printf '%s\n' 'g/^@/j' ',p' 'Q' | ed -s file
@Abbb
@Bbbb
@Dccc

上面使用一个简短的ed脚本将文件中与正则表达式匹配的每一行^@与其后面的行连接起来。然后它打印编辑缓冲区中的所有行并退出而不保存。


$ sed '/^@/ { N; s/\n//; }' file
@Abbb
@Bbbb
@Dccc

sed如果当前行匹配,则此命令将下一行追加到输入缓冲区^@。插入的换行符将被删除并打印该行。

@如果紧接着有这样一行开头,这两种变体都会错过以 开头的行。这意味着,他们会转向

@1
@2
X
@3
Y

进入

@1@2
X
@3Y

而不是

@1@2X
@3Y

目前尚不清楚这是否可以。

答案2

Perl 来救援!

perl -pe 'chomp if /^@/' -- file
  • -p逐行读取输入并在处理后打印每一行
  • /^@/匹配@行首的
  • 咀嚼删除尾随换行符

答案3

非sed

  1. 如果您知道所有行都交替使用@和非@,那么

    paste -d '' - - < file
    
  2. awk

    awk '{printf "%s%s", $0, (/^@/ ? "" : ORS)}' file
    

答案4

perl

$ perl -pe 's/^(@.*)\n/\1/' file
@Abbb
@Bbbb
@Dccc

或者

$ perl -pe 's/\n// if /^@/' file
@Abbb
@Bbbb
@Dccc

相关内容