我正在尝试使用sed删除空行:
sed '/^$/d'
但我没有运气。
例如,我有以下几行:
xxxxxx
yyyyyy
zzzzzz
我希望它像:
xxxxxx
yyyyyy
zzzzzz
这应该是什么代码?
我正在尝试使用sed删除空行:
sed '/^$/d'
但我没有运气。
例如,我有以下几行:
xxxxxx
yyyyyy
zzzzzz
我希望它像:
xxxxxx
yyyyyy
zzzzzz
这应该是什么代码?
Answers:
您的“空”行中可能有空格或制表符。使用POSIX类与sed
去除只含有空格的所有行:
sed '/^[[:space:]]*$/d'
使用ERE的较短版本,例如gnu sed:
sed -r '/^\s*$/d'
(请注意,sed的确实不支持PCRE)。
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
将匹配所有“空”行,此处为空表示行不包含任何字符,或者行仅包含空字符串(例如空格)。使用d
命令sed将删除所有匹配的行。
我缺少awk
解决方案:
awk 'NF' file
哪个会返回:
xxxxxx
yyyyyy
zzzzzz
这是如何运作的?由于NF
代表“字段数”,因此那些空行具有0个字段,因此awk会将0评估为False,并且不打印任何行;但是,如果至少有一个字段,则评估结果为True,并awk
执行其默认操作:打印当前行。
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
您是否知道将其包含在awk脚本(例如模式)中的巧妙方法?awk'/ mypattern / {do stuff ...}'
awk 'NF {do stuff...}'
。
sed '/^$/d'
应该没问题,您是否希望在适当位置修改文件?如果是这样,则应使用该-i
标志。
也许这些行不是空的,所以如果是这种情况,请看以下问题:从txtfiles中删除空行,从行首和行尾删除空格,我相信这就是您要实现的目标。
sed -i '/^$/d'
是做到这一点的一种方法。
[]
应该不是在括号表达式进行转义,所以这里的代码是不正确的\[\[:space:\]\]
或\[ \t\]
-应[[:space:]]
和[ \t]
。
我相信这是最简单,最快的方法:
cat file.txt | grep .
如果您还需要忽略所有空白行,请尝试以下操作:
cat file.txt | grep '\S'
例:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
输出
7
5
cat
,grep
需要的文件,以及:grep . file.txt
grep '\S'
绝对不是便携式的。如果可以,grep -P
则可以使用,grep -P '\S'
但也不是所有平台都支持。
grep .
与其他解决方案相比,它的缺点是它将所有文本突出显示为红色。其他解决方案可以保留原始颜色。比较unbuffer apt search foo | grep .
来unbuffer apt search foo | grep -v ^$
由于您的文本文件是在Windows上创建的,因此您很可能会看到意外的行为,因此行尾的顺序为\r\n
。您可以在运行sed或使用sed之前使用dos2unix将其转换为UNIX样式的文本文件。
sed -r "/^\r?$/d"
删除空行,无论是否有回车。
-r
标记的作用是什么,是否可以将其与-i
直接修改文件并避免打印到屏幕上。此外,我认为此命令也将适用于sed -r "/^\r$/d"
另一种选择无sed
,awk
,perl
,等
strings $file > $output
字符串-打印文件中可打印字符的字符串。
strings
不是string
?