通过 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

在 Bash 中删除空行并修剪周围的空间

从CSV中删除前导空格会导致插入空行和删除行

从bash中的字符串中删除所有特殊字符和大小写

从文本文件中删除 Unicode 字符 - sed ,其他 Bash/shell 方法

通过 grep 删除文本文件中的空行