这方面的代码应该是什么?

3 个评论
你的sed命令看起来很好,它应该工作
即使你没有空格/制表符,上面的命令也不会起作用,但 CR+LF line endings .
linux
unix
sed
jonas
jonas
发布于 2013-05-07
17 个回答
Kent
Kent
发布于 2021-12-12
已采纳
0 人赞同

你的 "空 "行中可能有空格或制表符。使用 POSIX类 sed 来删除所有只包含空白的行。

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

一个使用ERE的较短版本,例如用gnu sed。

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

(请注意,sed会在NOT support PCRE.)

Kent
@HuStmpHrrr gnu sed根本不支持PCRE,它是带有 -r 的ERE。
jww
OS X needed sed -i "" '/^[[:space:]]*$/d' <filename> ,
Kent
@BernieReiter ^\s*$ 将匹配所有的 "空 "行,这里的 "空 "是指,该行不包含任何字符,或者该行只包含空字符串(如空格)。所有匹配的行将被sed删除,使用 d 命令。
Perhaps sed '/\S/!d' file
fedorqui
fedorqui
发布于 2021-12-12
0 人赞同

我缺少 awk 的解决方案。

awk 'NF' file

Which would return:

xxxxxx
yyyyyy
zzzzzz

这是怎么做到的?由于NF代表 "字段数",那些空行有0个字段,所以awk将0评估为假,不打印任何一行;然而,如果至少有一个字段,评估为真,并使awk执行其默认动作:打印当前行。

Whoah.甚至在BSD的 "最小化 "版本的awk(版本20121220(FreeBSD))下运行。谢谢 :-)
@BernieReiter 欢迎你 :)是的,这是所有awk版本允许的一个非常基本的习惯性的东西。
虽然在快速和肮脏的测试中,我调用了两次awk,但它还是快了很多。 替换代码0 【替换代码1[替换代码2[替换代码3 【替换代码4 【替换代码5【替换代码6【替换代码7 你知道有什么好办法可以把它纳入awk-脚本中,比如说,一个模式? awk '/mypattern/ {do stuff...}'
请注意,这也会忽略只有空白的行。
这真是太酷了,谢谢
Oleg Mazko
Oleg Mazko
发布于 2021-12-12
0 人赞同
These show up correctly in your online tool, but [] should not 在括号表达式中被转义,所以这里的代码对于 \[\[:space:\]\] \[ \t\] 来说并不正确。- 应该是 [[:space:]] [ \t]
@BenjaminW.谢谢你注意到这一点。这些不是来自原作者,而是来自 Edit 3 当它从普通文本变为 "代码 "时,就 "暴露 "了`转义。我现在已经修复了它们。
Alberto Zaccagni
Alberto Zaccagni
发布于 2021-12-12
0 人赞同

sed '/^$/d' 应该没问题,你是想在原地修改文件吗?如果是的话,你应该使用 -i 标志。

也许这些行不是空的,所以如果是这样的话,请看这个问题 删除txt文件中的空行,删除行首和行尾的空格 我相信这就是你想达到的目的。

是的。我正在修改一个文件。*在sed命令中,-i应该如何放置?
替换代码0】是一种方法。
Vadim
Vadim
发布于 2021-12-12
0 人赞同

我相信这是最简单和最快的一种。

cat file.txt | grep .

如果你也需要忽略所有的白线,那么可以试试这个。

cat file.txt | grep '\S'
Below is TAB:\
Below is space:\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

outputs

No need for cat , grep takes files as well: grep . file.txt
是的,我知道,但最初的问题没有提到源是一个文件还是其他东西,所以解决方案是"|"后面的东西,而前面只是一个源的例子。只是为了区分解决方案和行的来源。
替换代码0】肯定是不便携的。 如果你有 grep -P ,那么你可以使用 grep -P '\S' ,但它也不支持所有平台。
与其他解决方案相比, grep . 的缺点是它会把所有的文字突出显示为红色。其他解决方案可以保留原来的颜色。比较 unbuffer apt search foo | grep . unbuffer apt search foo | grep -v ^$
@wisbucky grep并不默认为彩色输出,但经常通过shell别名或环境变量启用。使用 grep --color=never . 来重写。
user319660
user319660
发布于 2021-12-12
0 人赞同

Another option without sed , awk , perl , etc

strings $file > $output

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

Do you mean strings instead of string ?
"对于给定的每个文件,GNU strings都会打印出至少4个字符的可打印字符序列...... "因此,如果你没有意识到这一点,很短的行可能会给你一个惊喜。有一个 --bytes=min-len 选项可以允许更短的行。
ConMan
ConMan
发布于 2021-12-12
0 人赞同
在公认的答案的帮助下 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
    
Samuel Kenneth
Samuel Kenneth
发布于 2021-12-12
0 人赞同

你所尝试的命令是正确的,只是使用了-E标志。

sed -E '/^$/d'

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

tripleee
在这个特定的铰链中,没有任何东西需要 -E 标志。
tank
tank
发布于 2021-12-12
0 人赞同

你可以说。

sed -n '/ / p' filename    #there is a space between '//'
    
Timo
...这意味着 print all lines except the empty one(s) 和安静
Douglas Daseeco
Douglas Daseeco
发布于 2021-12-12
0 人赞同

你很可能看到这种意外的行为,因为你的文本文件是在Windows上创建的,所以行尾的序列是 \r\n 。 你可以在运行sed之前使用dos2unix将其转换为UNIX风格的文本文件,或者使用

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

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

你好, -r 的标志是做什么的,是否可以和 -i 结合起来,直接修改文件,避免打印到屏幕。此外,我认为这个命令也可以作为 sed -r "/^\r$/d" 使用。
Claes Wikner
Claes Wikner
发布于 2021-12-12
0 人赞同

这在awk中也适用。

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
    
Lowbit
Lowbit
发布于 2021-12-12
0 人赞同

你也可以用 "grep "做类似的事情。

egrep -v "^$" file.txt
    
justincbagley
justincbagley
发布于 2021-12-12
0 人赞同

我的 bash 的具体答案是建议使用 perl 替换操作符,并带有全局模式 g 标志,如下所示。

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

这个答案说明了核算空行中是否有空格([\ ]*),以及使用|来分隔多个搜索词/字段。在macOS High Sierra和CentOS 6/7上测试。

顺便说一下,OP的原始代码sed '/^$/d' $filebash中运行良好。在高性能超级计算集群的macOS High Sierra和CentOS 6/7 Linux上使用终端。

Kpym
Kpym
发布于 2021-12-12
0 人赞同

如果你想使用现代的Rust工具,你可以考虑。

  • ripgrep :
  • cat datafile | rg '.' line with spaces is considered non empty
  • cat datafile | rg '\S' line with spaces is considered empty
  • rg '\S' datafile line with spaces is considered empty ( -N can be added to remove line numbers for on screen display)
  • cat datafile | sd '^\n' '' line with spaces is considered non empty
  • cat datafile | sd '^\s*\n' '' line with spaces is considered empty
  • sd '^\s*\n' '' datafile inplace edit
  • Nilesh Shukla
    Nilesh Shukla
    发布于 2021-12-12
    0 人赞同

    Using vim editor to remove empty lines

    :%s/^$\n//g

    Vitaly
    Vitaly
    发布于 2021-12-12
    0 人赞同

    For me with FreeBSD 10.1 with sed worked only this solution:

    sed -e '/^[     ]*$/d' "testfile"
    

    []中,有空格和制表符。

    测试文件包含。

    fffffff next 1 tabline ffffffffffff
    ffffffff next 1 Space line ffffffffffff
    ffffffff empty 1 lines ffffffffffff
    ============ EOF =============