ChatGPT解决这个技术问题 Extra ChatGPT

使用 sed 删除空行

我正在尝试使用 sed 删除空行:

sed '/^$/d'

但我没有运气。

例如,我有这些行:

xxxxxx


yyyyyy


zzzzzz

我希望它像:

xxxxxx
yyyyyy
zzzzzz

这应该是什么代码?

你的 sed 命令看起来不错,它应该可以工作
即使您没有空格/制表符而是 CR+LF line endings,上述命令也不起作用。
对于 awk,请参阅:Remove blank lines in awkusing grep,一般情况下,请参阅:How to remove blank lines from a file in shell?

K
Kent

您的“空”行中可能有空格或制表符。将 POSIX classessed 一起使用以删除所有仅包含空格的行:

sed '/^[[:space:]]*$/d'

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

sed -r '/^\s*$/d'

(注意 sed 不支持 PCRE。)


@HuStmpHrrr gnu sed 根本不支持 PCRE。它是带有 -r 的 ERE
OS X 需要 sed -i "" '/^[[:space:]]*$/d' <filename>
@BernieReiter ^\s*$ 将匹配所有“空”行,此处为空意味着该行不包含字符,或者该行仅包含空字符串(例如空格)。 sed 将使用 d 命令删除所有匹配的行。
也许sed '/\S/!d' file
R
Ramy

我缺少 awk 解决方案:

awk 'NF' file

哪个会返回:

xxxxxx
yyyyyy
zzzzzz

这是如何运作的?由于 NF 代表“字段数”,那些为空的行有 0 个字段,因此 awk 将 0 评估为 False 并且不打印任何行;但是,如果至少有一个字段,则评估结果为 True,并使 awk 执行其默认操作:打印当前行。


哇。甚至运行 BSD 的“最小化”版本的 awk(版本 20121220 (FreeBSD)。谢谢 :-)
@BernieReiter 不客气 :) 是的,这是所有 awk 版本都允许的非常基本的惯用语。
而且它要快得多 - 对于快速而肮脏的测试 - 我调用 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/ {做事...}'
请注意,这也将忽略仅包含空格的行。
太酷了,谢谢
C
Community

sed '/^$/d' 应该没问题,您希望就地修改文件吗?如果是这样,您应该使用 -i 标志。

也许这些行不是空的,所以如果是这样的话,看看这个问题Remove empty lines from txtfiles, remove spaces from start and end of line我相信这就是你想要实现的。


是的。我正在修改一个文件。 *.csv。应该如何将 -i 放置到 sed 命令中?
sed -i '/^$/d' 是一种方法。
w
wisbucky

sed

'/^[[:space:]]*$/d'

'/^\s*$/d'

'/^$/d'

-n '/^\s*$/!p'

grep

.

-v '^$'

-v '^\s*$'

-v '^[[:space:]]*$'

awk

/./

'NF'

'长度'

'/^[ \t]*$/ {下一个;} {打印}'

'!/^[ \t]*$/'


这些在您的在线工具中正确显示,但 [] 不应在括号表达式中转义,因此此处的代码对于 \[\[:space:\]\]\[ \t\] 不正确 - 应为 {4 } 和 [ \t]
@BenjaminW。谢谢你抓住那个。这些不是来自原作者,而是来自Edit 3,当时它从常规文本更改为“代码”,然后“暴露”了 `\` 转义。我现在已经修好了。
V
Vadim

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

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

不需要 catgrep 也需要文件:grep . file.txt
是的,我知道,但最初的问题没有提到源是文件还是其他东西,所以解决方案是“|”之后的内容,之前只是一个源示例。只是为了区分解决方案和行的来源。
grep '\S' 绝对不可移植。如果您有 grep -P,那么您可以使用 grep -P '\S',但并非所有平台都支持它。
与其他解决方案相比,grep . 的缺点是它会将所有文本突出显示为红色。其他解决方案可以保留原始颜色。比较 unbuffer apt search foo | grep .unbuffer apt search foo | grep -v ^$
C
Community

在接受的答案 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


u
user319660

没有 sedawkperl 等的另一个选项

strings $file > $output

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


你的意思是 strings 而不是 string
“对于给定的每个文件,GNU 字符串都会打印至少 4 个字符长的可打印字符序列……”如果您不知道这一点,那么非常短的行可能会给您带来惊喜。有一个 --bytes=min-len 选项允许较短的行。
f
fedorqui

你可以说:

sed -n '/ / p' filename    #there is a space between '//'

.. 这意味着print all lines except the empty one(s)并且保持安静
S
Samuel Kenneth

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

sed -E '/^$/d'

-E 标志使 sed 捕获扩展的正则表达式。 More info here


在这个特定的正则表达式中没有任何东西需要 -E 标志。
B
Benjamin W.

您很可能会看到意外行为,因为您的文本文件是在 Windows 上创建的,因此行尾是 \r\n。您可以在运行 sed 或使用之前使用 dos2unix 将其转换为 UNIX 样式的文本文件

sed -r "/^\r?$/d"

删除空行,无论是否有回车符。


您好,-r 标志是做什么的,是否可以将其与 -i 结合使用以直接修改文件并避免打印到屏幕上。另外,我认为这个命令也可以作为 sed -r "/^\r$/d"
C
Claes Wikner

这也适用于 awk。

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz

L
Lowbit

你也可以使用“grep”来做类似的事情:

egrep -v "^$" file.txt

j
justincbagley

我的 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 终端中运行良好。


K
Kpym

如果你想使用现代的 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' '' 数据文件就地编辑


N
Niket Srivastav

NF 是 awk 的命令,可用于删除文件 awk NF filename 中的空行并使用 sed sed -r "/^\r?$/d"


这两个答案在几年前就已经给出了。
f
fedorqui

对我来说,使用 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 =============

N
Nilesh Shukla

使用 vim 编辑器删除空行

:%s/^$\n//g