Bru*_*ger 46
只是为了删除空行:
sed '/^$/d'
Run Code Online (Sandbox Code Playgroud)
sed
是面向行的,因此除非该字节是换行符,否则考虑“2 个或多个特定字节”是可行的。然后你必须想出对整个生产线都有效的东西。
Sté*_*las 26
不需要sed
。grep
会做:
grep .
Run Code Online (Sandbox Code Playgroud)
(即grep
、SPC、点,即匹配任何包含至少一个字符的行)。
还有:
tr -s '\n'
Run Code Online (Sandbox Code Playgroud)
(将任何换行符序列压缩为一个)。
正如克里斯所指出的,两者并不等效,因为删除空行(如上面的第一个解决方案和大多数其他答案集中在此处)与在第一行为空的情况下按要求挤压换行符序列不同只需要一个前导换行符使第一行为空。
mik*_*erv 13
如果您想为任何给定的空行序列保留一个空行,您可以这样做:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
Run Code Online (Sandbox Code Playgroud)
删除是什么意思?删除重复项(许多空行变为一行)还是全部删除?
如果要删除重复项,这里是使用 sed 的方法:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Run Code Online (Sandbox Code Playgroud)
它模拟uniq
命令。
最好的选择是使用awk
:
awk NF <filename>
Run Code Online (Sandbox Code Playgroud)
对于大多数答案,首先需要删除尾随空格。删除重复的换行符会删除所有空白行。(想想这个)。
从字面上解释,OP 希望“如果存在重复的空行,则从文件中删除所有空行”。
典型的用户希望“仅删除重复的空白行”。
为此,首先删除尾随空白,然后通过 cat -s 进行管道传输
sed s/[[:space:]]*$// | cat -s
Run Code Online (Sandbox Code Playgroud)
然而,这不会删除多余的前导或尾随空白行。
看过@Bruce Ediger 的回答很 sed
不是最好的工具,因为它是基于行的,并将其\n
视为行尾字符,这会变得复杂。sed
可能是完成这项工作的完美工具,但这里还有一些其他选择:
珀尔
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)
$/
输入记录分隔符,默认换行。这影响了 Perl 关于“线”是什么的想法。像 awk 的 RS 变量一样工作,包括将空行视为终止符,如果设置为空字符串(空行不能包含任何空格或制表符)。您可以将其设置为多字符字符串以匹配多字符终止符,或设置为 undef 以通读文件末尾。如果文件包含连续的空行,则将其设置为 "\n\n" 的含义与设置为 "" 略有不同。设置为 "" 会将两个或多个连续空行视为单个空行。设置为 "\n\n" 将盲目地假设下一个输入字符属于下一个段落,即使它是一个换行符。
呆呆的/呆呆的
awk '$1' file.txt
Run Code Online (Sandbox Code Playgroud)
这将适用于发布的示例,但正如@Stephane Chazelas指出的那样,它还将删除第一个字段“看起来像”的行0
。这更健壮:
awk NF file.txt
Run Code Online (Sandbox Code Playgroud)