使用sed删除空行

jon*_*nas 312 unix linux sed

我试图使用sed删除空行:

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

但我没有运气.

例如,我有这些行:

xxxxxx


yyyyyy


zzzzzz
Run Code Online (Sandbox Code Playgroud)

我希望它像:

xxxxxx
yyyyyy
zzzzzz
Run Code Online (Sandbox Code Playgroud)

应该是什么代码?

Ken*_*ent 587

您的"空"行可能包含空格或制表符.使用POSIX类sed去除只含有空格的所有行:

sed '/^[[:space:]]*$/d'
Run Code Online (Sandbox Code Playgroud)

使用ERE的较短版本,例如使用gnu sed:

sed -r '/^\s*$/d'
Run Code Online (Sandbox Code Playgroud)

(请注意,sed的确实支持PCRE).

  • OS X需要`sed -i""'/ ^ [[:space:]]*$/d'`***`<filename>`***, (7认同)
  • @HuStmpHrrr gnu sed根本不支持PCRE.它是带有`-r`的ERE (3认同)
  • @BernieReiter `^\s*$` 将匹配所有“空”行,这里的空意味着该行不包含字符,或者该行仅包含空字符串(例如空格)。sed 将使用“d”命令删除所有匹配的行。 (2认同)

fed*_*qui 80

我错过了awk解决方案:

awk 'NF' file
Run Code Online (Sandbox Code Playgroud)

哪个会回归:

xxxxxx
yyyyyy
zzzzzz
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?由于NF代表"字段数",那些空的行有0个fiedls,因此awk评估0到False并且没有打印行; 但是,如果至少有一个字段,则评估为True并awk执行其默认操作:打印当前行.

  • 请注意,这也将忽略仅包含空格的行。 (2认同)

Alb*_*gni 54

sed '/^$/d'应该没问题,您是否希望修改文件?如果是这样,你应该使用-i旗帜.

也许那些行不是空的,所以如果是这样的话,看看这个问题从txtfiles中删除空行,从行的开头和结尾删除空格我相信这是你想要实现的.

  • `sed -i'/ ^ $/d'`是这样做的一种方式. (2认同)

Ole*_*zko 39

SED

grep的

AWK

  • 这些在您的在线工具中正确显示,但“[]”不应该在括号表达式中转义,因此此处的代码对于“\[\[:space:\]\]”或“\”不正确[ \t\]` - 应该是 `[[:space:]]` 和 `[ \t]`。 (2认同)

Vad*_*dim 29

我相信这是最简单,最快的一个:

cat file.txt | grep .
Run Code Online (Sandbox Code Playgroud)

如果你需要忽略所有的空格行,那么试试这个:

cat file.txt | grep '\S'
Run Code Online (Sandbox Code Playgroud)

例:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
Run Code Online (Sandbox Code Playgroud)

输出

7
5
Run Code Online (Sandbox Code Playgroud)

  • 不需要`cat`,`grep`也需要文件:`grep.file.txt` (5认同)
  • 是的,我知道,但最初的问题没有提到源是文件还是其他东西,所以解决方案是在"|"之后,而在它之前只是一个源的例子.只需区分解决方案和行的来源. (3认同)
  • grep'\ S'绝对不是可移植的。如果您有`grep -P`,那么您可以使用`grep -P'\ S'`,但并非所有平台都支持。 (2认同)

Con*_*Man 14

此处接受的答案和上面接受的答案的帮助下,我使用了:

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space
Run Code Online (Sandbox Code Playgroud)

这涵盖了所有基础,完美地满足了我的需求.感谢@Kent和@kev的原创海报


use*_*660 12

另一种选择无sedawkperl,等

strings $file > $output
Run Code Online (Sandbox Code Playgroud)

字符串 - 在文件中打印可打印字符的字符串。

  • “对于给定的每个文件,GNU 字符串打印至少 4 个字符长的可打印字符序列......”因此,如果您不知道这一点,那么非常短的行可能会给您带来惊喜。有一个“--bytes=min-len”选项允许更短的行。 (2认同)

小智 9

您尝试的命令是正确的,只需使用 -E 标志即可。

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

-E 标志使 sed 捕获扩展正则表达式。更多信息请点击此处


小智 5

你可以说:

sed -n '/ / p' filename    #there is a space between '//'
Run Code Online (Sandbox Code Playgroud)