我的 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
答案3
非sed
如果您知道所有行都交替使用@和非@,那么
paste -d '' - - < file
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