通过 Bash 从文本文件中删除空行,包括空格字符 [重复]
Posted
技术标签:
【中文标题】通过 Bash 从文本文件中删除空行,包括空格字符 [重复]【英文标题】:Delete empty lines from a text file via Bash including empty spaces characters [duplicate] 【发布时间】:2017-05-23 07:09:25 【问题描述】:我尝试使用“sed”命令删除空行。
sed -i '/^$/d' file.txt
我的示例 txt 文件看起来像这样。第二行有空格字符。 sed 命令仅删除空行,但不删除带有空格的行。
Sample text
Sample text
那么有没有办法通过 bash 来实现呢。
我的预期输出是
Sample text
Sample text
【问题讨论】:
您的预期输出是什么,究竟?你想要testline
吗?你想删除任何包含空格的行吗?
试试sed '/^\s*$/d'
...文件是否应该只包含testlinetestline
,没有空格包括换行符? (这实际上真的很容易,成为tr
可以做的工作)。
@MichaelCoker, \s
不是由 BRE 或 ERE 定义的; [[:space:]]
是可移植的编写方式。
@NirojanSelvanathan, ...re:使预期的输出清晰,用它来编辑问题。您可能还希望在示例内容中包含 应该 的行,这样试图搞笑的人就不会告诉您写 > yourfile
作为适用于测试数据的答案给定的。
【参考方案1】:
使用字符类[:blank:]
表示空格或制表符:
sed
:
sed -i '/^[[:blank:]]*$/ d' file.txt
perl
:
perl -ne 'print if !/^[[:blank:]]*$/' file.txt
与awk
:
awk '!/^[[:blank:]]*$/' file.txt
与grep
:
grep -v '^[[:blank:]]*$' file.txt
如果该工具不支持就地编辑,请利用临时文件,例如对于grep
:
grep -v '^[[:blank:]]*$' file.txt >file.txt.tmp && mv file.txt.tmp,
【讨论】:
【参考方案2】:sed -i '/^ *$/d' file.txt
或者也匹配其他空白字符,例如制表符等:
sed -i '/^[[:space:]]*$/d' file.txt
* 字符匹配前面字符的 0 个或多个实例
【讨论】:
\s
适用于任何类型的空格,而不仅仅是空格。
或[[:space:]]
以获得偏好。
\s
不能保证在 POSIX sed
中工作。这是一个地方,除非问题中指定了支持 PCRE 扩展的特定实现,否则我认为指定 POSIX BRE 语法以外的任何内容都是错误。
我刚刚在 Mac OS X 10.11.6、GNU bash、版本 3.2.57(1)-release (x86_64-apple-darwin15) 上测试了 '/^\s*$/d'
,它与某些行不匹配只是空格,但以下确实有效:'/^[[:space:]]*$/d'
@user122992, ...要清楚,顺便说一句,重要的是 sed
的版本,而不是 bash 的版本。以上是关于通过 Bash 从文本文件中删除空行,包括空格字符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用正则匹配删除文本空行 - 正则 - 空白行 - vscode