如何使用sed命令去除字符串中的重复字符(如换行符)
要把连续多个换行符压缩成单个,以下几种常用命令可以实现:
方法1:使用 tr(最简单)
tr 的 -s 选项专门用来压缩连续重复的字符,直接指定换行符即可:
tr -s '\n' < input.txt > output.txt
-s 会把连续出现的指定字符(这里是\n)替换成单个,非连续的换行保持不变。
方法2:使用 GNU sed
sed 默认逐行处理,换行符是行分隔符,所以需要特殊处理多行:
方式A:利用多行模式空间
sed '/^$/N;/^\n$/D' input.txt
/^$/N:匹配空行时,把下一行加入模式空间/^\n$/D:如果模式空间里是两个连续空行(即\n开头),删除第一个换行符并重新处理
方式B:使用 -z 选项(GNU sed 独有)
把整个文件读成一个字符串(用NUL分隔),直接替换连续换行:
sed -z 's/\n\n\+/\n/g' input.txt
\n\n\+ 匹配两个及以上连续换行,替换成单个换行。注意如果原文件末尾有多个换行,可能需要额外处理。
方法3:使用 awk
通过跟踪空行状态来过滤连续空行:
awk 'NF {print; blank=0} !NF {if (!blank) {print; blank=1}}' input.txt
NF:匹配非空行,打印并重置空行标记blank为0!NF:匹配空行,只有当blank为0时才打印,然后把blank设为1,避免连续输出空行
为什么你之前的命令无效
你用的sed s/\n//g会删除所有换行,是因为sed默认把每一行读入模式空间时,换行符作为行分隔符被过滤掉了,模式空间里根本没有换行符,所以这个命令实际上不会对换行生效——除非用特殊方式让sed处理多行内容。
内容的提问来源于stack exchange,提问作者vishwajeet_preeti
相关产品推荐
相关产品推荐

