你的 "空 "行中可能有空格或制表符。使用
POSIX类
用
sed
来删除所有只包含空白的行。
sed '/^[[:space:]]*$/d'
一个使用ERE的较短版本,例如用gnu sed。
sed -r '/^\s*$/d'
(请注意,sed会在NOT support PCRE.)
这方面的代码应该是什么?
你的 "空 "行中可能有空格或制表符。使用
POSIX类
用
sed
来删除所有只包含空白的行。
sed '/^[[:space:]]*$/d'
一个使用ERE的较短版本,例如用gnu sed。
sed -r '/^\s*$/d'
(请注意,sed会在NOT support PCRE.)
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))下运行。谢谢 :-)
fedorqui
:
@BernieReiter 欢迎你 :)是的,这是所有awk版本允许的一个非常基本的习惯性的东西。
虽然在快速和肮脏的测试中,我调用了两次awk,但它还是快了很多。 替换代码0 【替换代码1[替换代码2[替换代码3 【替换代码4 【替换代码5【替换代码6【替换代码7 你知道有什么好办法可以把它纳入awk-脚本中,比如说,一个模式? awk '/mypattern/ {do stuff...}'
wisbucky
:
请注意,这也会忽略只有空白的行。
woland
:
这真是太酷了,谢谢
Oleg Mazko
发布于
2021-12-12
0
人赞同
These show up correctly in your online tool, but
[]
should
not
在括号表达式中被转义,所以这里的代码对于
\[\[:space:\]\]
或
\[ \t\]
来说并不正确。- 应该是
[[:space:]]
和
[ \t]
。
Alberto Zaccagni
发布于
2021-12-12
0
人赞同
sed '/^$/d'
应该没问题,你是想在原地修改文件吗?如果是的话,你应该使用
-i
标志。
也许这些行不是空的,所以如果是这样的话,请看这个问题
删除txt文件中的空行,删除行首和行尾的空格
我相信这就是你想达到的目的。
jonas
:
是的。我正在修改一个文件。*在sed命令中,-i应该如何放置?
替换代码0】是一种方法。
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
Vadim
:
是的,我知道,但最初的问题没有提到源是一个文件还是其他东西,所以解决方案是"|"后面的东西,而前面只是一个源的例子。只是为了区分解决方案和行的来源。
tripleee
:
替换代码0】肯定是不便携的。 如果你有
grep -P
,那么你可以使用
grep -P '\S'
,但它也不支持所有平台。
wisbucky
:
与其他解决方案相比,
grep .
的缺点是它会把所有的文字突出显示为红色。其他解决方案可以保留原来的颜色。比较
unbuffer apt search foo | grep .
和
unbuffer apt search foo | grep -v ^$
。
@wisbucky grep并不默认为彩色输出,但经常通过shell别名或环境变量启用。使用
grep --color=never .
来重写。
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
发布于
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
发布于
2021-12-12
0
人赞同
你所尝试的命令是正确的,只是使用了-E标志。
sed -E '/^$/d'
-E 标志使 sed 捕获扩展的正则表达式。 More info here
tripleee
:
在这个特定的铰链中,没有任何东西需要
-E
标志。
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
发布于
2021-12-12
0
人赞同
你很可能看到这种意外的行为,因为你的文本文件是在Windows上创建的,所以行尾的序列是
\r\n
。 你可以在运行sed之前使用dos2unix将其转换为UNIX风格的文本文件,或者使用
sed -r "/^\r?$/d"
来删除空行,无论是否有回车键。
你好,
-r
的标志是做什么的,是否可以和
-i
结合起来,直接修改文件,避免打印到屏幕。此外,我认为这个命令也可以作为
sed -r "/^\r$/d"
使用。
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' $file
在bash
中运行良好。在高性能超级计算集群的macOS High Sierra和CentOS 6/7 Linux上使用终端。
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
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 =============