sed 可以删除“双”换行符吗?

Mic*_*ant 29 sed

我有一个包含很多空行的文档。

当有 2 个或更多时,我如何删除它们。

我试过sed "s/\n\n//"文件,但没有用。没有错误。

Bru*_*ger 46

只是为了删除空行:

sed  '/^$/d'
Run Code Online (Sandbox Code Playgroud)

sed是面向行的,因此除非该字节是换行符,否则考虑“2 个或多个特定字节”是可行的。然后你必须想出对整个生产线都有效的东西。

  • 这似乎并没有回答问题,因为它删除了 _all_ 空行,而不仅仅是连续的空行。 (3认同)
  • `sed` 能够通过其“模式空间”/“保持空间”功能处理多行。但是我觉得太复杂了。;-) (2认同)
  • 为了使其在第一个字符是换行符时工作(如果这确实是必需的),那么您可以使用负地址 `1!` 将命令括起来(匹配除第 1 行之外的所有内容),因此:`sed '1!{/ ^$/d'}`。 (2认同)

Sté*_*las 26

不需要sedgrep会做:

grep .
Run Code Online (Sandbox Code Playgroud)

(即grep、SPC、点,即匹配任何包含至少一个字符的行)。

还有:

tr -s '\n'
Run Code Online (Sandbox Code Playgroud)

(将任何换行符序列压缩为一个)。

正如克里斯所指出的,两者并不等效,因为删除空行(如上面的第一个解决方案和大多数其他答案集中在此处)与在第一行为空的情况下按要求挤压换行符序列不同只需要一个前导换行符使第一行为空。

  • 如果文件的第一个字符是换行符,这将无法正常工作:http://sprunge.us/FLAJ (2认同)

mik*_*erv 13

如果您想为任何给定的空行序列保留一个空行,您可以这样做:

sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一的答案(除了`cat -s`),它实际上完成了我所理解的问题。(而且它比 `cat -s` 更好,因为我可以将 `sed -i` 与它一起使用。) (3认同)
  • 你能解释一下吗? (3认同)

cuo*_*glm 9

删除是什么意思?删除重复项(许多空行变为一行)还是全部删除?

如果要删除重复项,这里是使用 sed 的方法:

sed '$!N; /^\(.*\)\n\1$/!P; D'
Run Code Online (Sandbox Code Playgroud)

它模拟uniq命令。

最好的选择是使用awk

awk NF <filename>
Run Code Online (Sandbox Code Playgroud)


mck*_*nzm 7

对于大多数答案,首先需要删除尾随空格。删除重复的换行符会删除所有空白行。(想想这个)。

从字面上解释,OP 希望“如果存在重复的空行,则从文件中删除所有空行”。

典型的用户希望“仅删除重复的空白行”。

为此,首先删除尾随空白,然后通过 cat -s 进行管道传输

sed  s/[[:space:]]*$// | cat -s
Run Code Online (Sandbox Code Playgroud)

然而,这不会删除多余的前导或尾随空白行。


ter*_*don 6

sed不是最好的工具,因为它是基于行的,并将其\n视为行尾字符,这会变得复杂。看过@Bruce Ediger 的回答很 sed可能是完成这项工作的完美工具,但这里还有一些其他选择:

  1. 珀尔

    perl -ne 'print if /./' file.txt
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    perl -pe '$/=""; s/\n+/\n/;' file.txt 
    
    Run Code Online (Sandbox Code Playgroud)

    感谢@ruakh让我去阅读这篇文章

    $/

    输入记录分隔符,默认换行。这影响了 Perl 关于“线”是什么的想法。像 awk 的 RS 变量一样工作,包括将空行视为终止符,如果设置为空字符串(空行不能包含任何空格或制表符)。您可以将其设置为多字符字符串以匹配多字符终止符,或设置为 undef 以通读文件末尾。如果文件包含连续的空行,则将其设置为 "\n\n" 的含义与设置为 "" 略有不同。设置为 "" 会将两个或多个连续空行视为单个空行。设置为 "\n\n" 将盲目地假设下一个输入字符属于下一个段落,即使它是一个换行符。

  2. 呆呆的/呆呆的

    awk '$1' file.txt
    
    Run Code Online (Sandbox Code Playgroud)

    这将适用于发布的示例,但正如@Stephane Chazelas指出的那样,它还将删除第一个字段“看起来像”的行0。这更健壮:

    awk NF file.txt
    
    Run Code Online (Sandbox Code Playgroud)