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


25

我有一个空行很多的文件。

在一起2个或更多时如何删除它们。

我尝试了sed "s/\n\n//"文件,但是没有用。没错


3
如果您不想删除所有空白行,但仅当两个或更多空白行时,我才能正确阅读吗?所以没有单一的空行?
Runium

1
如果是两行或更多行,是否真的要删除所有行或仅删除一行?
Hauke Laging

Answers:


42

只是为了删除空行:

sed  '/^$/d'

sed它是面向行的,因此根据“一个特定字节的2个或多个”来进行思考是可行的,除非该字节是换行符。然后,您必须考虑一些适用于整个生产线的东西。


当然!+1为简单优雅。
terdon

2
sed能够通过其“样式空间” /“保留空间”功能处理多行。但是我觉得那太复杂了。;-)
Hauke Laging

如果文件的第一个字符是换行符,则此功能将无法正常运行。
克里斯·唐尼

1
为了使它在第一个字符是换行符(如果确实是换行符)时起作用,则可以用负地址括住该命令1!(匹配第1行以外的所有字符),因此:sed '1!{/^$/d'}
Toby Speight

1
@AaronFranke-是的,但这是Linux Shell如何对待'>'重定向的一个方面。shell查看命令行,看到stdout到文件的'>'重定向,创建该文件,然后运行sed。创建文件实际上将删除任何具有相同名称的现有文件。 sed '/^&/d' file.txt > otherfile.txt将工作。
布鲁斯·埃迪格

24

不需要sedgrep会做:

grep .

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

还有:

tr -s '\n'

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

正如Chris所指出的,两者都不相等,因为删除空行(例如上面的第一个解决方案,以及大多数其他答案都集中在此处)与在第一行为空的情况下按要求挤压换行符序列不同。只需要一个换行符就可以使第一行为空。


2
如果文件的第一个字符是换行符,则此功能将无法正常运行:sprunge.us/FLAJ
Chris Down

7

sed并不是最好的工具,因为它是基于行的,并且被视为\n行尾字符,因此变得很复杂。看到@Bruce Ediger的答案很 sed可能是完成此工作的理想工具,不过,这里还有其他一些选择:

  1. 佩尔

    perl -ne 'print if /./' file.txt
    

    要么

    perl -pe '$/=""; s/\n+/\n/;' file.txt 
    

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

    $ /

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

  2. 高克

    awk '$1' file.txt
    

    这将适用于发布的示例,但正如@Stephane Chazelas指出的那样,它还将删除第一个字段为“ looks like”的行0。这更可靠:

    awk NF file.txt
    

对于Perl,perl -pe 's/\n+/\n/ file.txt将这样做,输入记录分隔符与此无关。
vonbrand

@vonbrand否,perl -peperl -ne逐行工作。\n+永远不会匹配,因为它仅应用于一行。这就是为什么你需要任一组$/或使用-0TI发出声音文件的整体:perl -0pe 's/\n+/\n/' file
terdon

6

你是什​​么意思删除?删除重复项(很多空白行到一个)还是全部删除?

如果要删除重复项,请使用sed方法:

sed '$!N; /^\(.*\)\n\1$/!P; D'

它模拟uniq命令。

最好的选择是使用awk

awk NF <filename>

sed部分效果很好!建议将此作为最佳答案。
Akito

2

对于大多数这些答案,首先必须删除尾随空格。删除加倍的换行符将删除所有空白行。(考虑一下)。

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

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

为此,请先除去结尾的whitepace,然后通过cat -s进行管道传输

sed  s/[[:space:]]*$// | cat -s

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


投票不足,但这显然有效吗?没有意见 ?
mckenzm 2015年

1
我为您投票赞成...您知道...回答这个问题。=)我无法相信Bruce Ediger删除行空白后的反应都会受到欢迎。如果有人问如何删除重复的空白行,我无法想象删除所有空白行都是可以接受的解决方案。但是无所谓。顺便说一下,网站上有sed的页面,涵盖了这一点:gnu.org/software/sed/manual/sed.html#cat-_002ds
Todd Walton

2

如果要为任何给定的空白行序列保留单个空白行,则可以执行以下操作:

sed -e '/./b' -e :n -e 'N;s/\n$//;tn'

1
cat -s根据我的理解,这是唯一能够真正完成所问问题的答案(除外)。(而且比cat -s我可以使用它要好sed -i。)
Matthew

-2

尝试同时sed -e 's#\\n\\n#\\n#g' input.file > output.file使用/字段分隔符和正则表达式的一部分,这可能是问题所在。


2
只是给了我一个文件序列中包含双倍和三倍换行符的旋转。对我根本不起作用。
语法错误

-3

使用此命令:

tr -s '\r' '\n'

是的,他们的答案对我不起作用。
喵2016年

5
AFAIK这个答案不正确。我建议哟删除它。
zuazo

哦,这是因为我的文件实际上包含许多换行符和回车符。0x0d0a

2
实际上,该命令删除窗口行尾的重复行。用测试echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'。该命令tr将全部转换\r为一个\n,然后将全部压缩\n为一个。因此,它确实有效,不确定该如何应用到Windows(而不是UNIX)这一事实。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.