【问题标题】:Delete empty lines from a text file via Bash including empty spaces characters [duplicate]通过 Bash 从文本文件中删除空行,包括空格字符 [重复]
【发布时间】: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 作为适用于测试数据的答案给定的。

标签: linux bash


【解决方案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 的版本。
    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 2015-01-13
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多