我正在尝试使用 sed 删除空行:
sed '/^$/d'
但我没有运气。
例如,我有这些行:
xxxxxx
yyyyyy
zzzzzz
我希望它像:
xxxxxx
yyyyyy
zzzzzz
这应该是什么代码?
您的“空”行中可能有空格或制表符。将 POSIX classes 与 sed
一起使用以删除所有仅包含空格的行:
sed '/^[[:space:]]*$/d'
使用 ERE 的较短版本,例如使用 gnu sed:
sed -r '/^\s*$/d'
(注意 sed 不支持 PCRE。)
我缺少 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/ {做事...}'
sed '/^$/d'
应该没问题,您希望就地修改文件吗?如果是这样,您应该使用 -i
标志。
也许这些行不是空的,所以如果是这样的话,看看这个问题Remove empty lines from txtfiles, remove spaces from start and end of line我相信这就是你想要实现的。
sed -i '/^$/d'
是一种方法。
sed
'/^[[:space:]]*$/d'
'/^\s*$/d'
'/^$/d'
-n '/^\s*$/!p'
grep
.
-v '^$'
-v '^\s*$'
-v '^[[:space:]]*$'
awk
/./
'NF'
'长度'
'/^[ \t]*$/ {下一个;} {打印}'
'!/^[ \t]*$/'
[]
不应在括号表达式中转义,因此此处的代码对于 \[\[:space:\]\]
或 \[ \t\]
不正确 - 应为 {4 } 和 [ \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 ^$
在接受的答案 here 和上面接受的答案的帮助下,我使用了:
$ 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
这涵盖了所有基础,非常适合我的需求。感谢原始海报@Kent 和@kev
没有 sed
、awk
、perl
等的另一个选项
strings $file > $output
字符串 - 打印文件中可打印的字符串。
strings
而不是 string
?
--bytes=min-len
选项允许较短的行。
你可以说:
sed -n '/ / p' filename #there is a space between '//'
print all lines except the empty one(s)
并且保持安静
您尝试的命令是正确的,只需使用 -E 标志即可。
sed -E '/^$/d'
-E 标志使 sed 捕获扩展的正则表达式。 More info here
-E
标志。
您很可能会看到意外行为,因为您的文本文件是在 Windows 上创建的,因此行尾是 \r\n
。您可以在运行 sed 或使用之前使用 dos2unix 将其转换为 UNIX 样式的文本文件
sed -r "/^\r?$/d"
删除空行,无论是否有回车符。
-r
标志是做什么的,是否可以将其与 -i
结合使用以直接修改文件并避免打印到屏幕上。另外,我认为这个命令也可以作为 sed -r "/^\r$/d"
这也适用于 awk。
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
你也可以使用“grep”来做类似的事情:
egrep -v "^$" file.txt
我的 bash
特定答案是建议为此使用带有全局模式 g
标志的 perl
替换运算符,如下所示:
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
此答案说明了考虑空行中是否包含空格 ([\ ]*
),以及使用 |
分隔多个搜索词/字段。在 macOS High Sierra 和 CentOS 6/7 上测试。
仅供参考,OP 的原始代码 sed '/^$/d' $file
在高性能超级计算集群的 macOS High Sierra 和 CentOS 6/7 Linux 上的 bash
终端中运行良好。
如果你想使用现代的 Rust 工具,你可以考虑:
ripgrep: 猫数据文件 | rg'。带空格的行被认为是非空 cat 数据文件 | rg '\S' 带空格的行被认为是空的 rg '\S' 带空格的数据文件行被认为是空的(可以添加-N 以删除屏幕显示的行号)
猫数据文件 | rg'。带空格的行被认为是非空的
猫数据文件 | rg '\S' 带空格的行被认为是空的
rg '\S' 带有空格的数据文件行被认为是空的(可以添加 -N 以删除屏幕显示的行号)
sd cat 数据文件 | sd '^\n' '' 带空格的行被认为是非空 cat 数据文件 | sd '^\s*\n' '' 带空格的行被认为是空的 sd '^\s*\n' '' 数据文件就地编辑
猫数据文件 | sd '^\n' '' 带空格的行被认为是非空的
猫数据文件 | sd '^\s*\n' '' 带空格的行被认为是空的
sd '^\s*\n' '' 数据文件就地编辑
NF 是 awk 的命令,可用于删除文件 awk NF filename
中的空行并使用 sed sed -r "/^\r?$/d"
对我来说,使用 sed 的 FreeBSD 10.1 仅适用于这个解决方案:
sed -e '/^[ ]*$/d' "testfile"
[]
内有空格和制表符。
测试文件包含:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============
使用 vim 编辑器删除空行
:%s/^$\n//g
不定期副业成功案例分享
-r
的 EREsed -i "" '/^[[:space:]]*$/d'
<filename>
,^\s*$
将匹配所有“空”行,此处为空意味着该行不包含字符,或者该行仅包含空字符串(例如空格)。 sed 将使用d
命令删除所有匹配的行。sed '/\S/!d' file