使用sed删除文件中的空白行

时间:2018-08-10 09:04:43

标签: sed replace substitution

France  211 55  Europe

Japan   144 120 Asia
Germany 96  61  Europe

England 94  56  Europe




Taiwan  55  144 Asia
North Korea 44  2134    Asia

上面是我的数据文件。

其中有空行。

这些空行中没有空格或制表符。

我要删除数据中的所有空行。

我进行了一次搜索Delete empty lines using SED,给出了完美的答案。

在此之前,我自己写了两个 sed代码

sed -r 's/\n\n+/\n/g' cou.data
sed 's/\n\n\n*/\n/g' cou.data

我尝试了awk gsub,也没有成功。

awk '{ gsub(/\n\n*/, "\n"); print }' cou.data

但是它们不起作用,没有任何变化。

我的sed代码在哪里出错?

2 个答案:

答案 0 :(得分:3)

使用以下sed删除所有空白行。

sed '/./!d' cou.data

说明:

  • /./ 匹配任何字符,包括换行符。
  • ! 否定选择器,即,它使命令应用于与选择器不匹配的行,在这种情况下为空行。
  • d 删除选定的行。
  • cou.data 是输入文件的路径。

您在哪里出错了?

以下来自 How sed Works的摘录指出:

  

sed通过在输入的每一行上执行以下循环来进行操作:首先, sed从输入流中读取一行删除任何尾随的换行符,并将其放在模式空间。 然后执行命令;每个命令都可以有一个与之关联的地址:地址是一种条件代码,只有在执行命令之前验证了条件的情况下,命令才会执行。

     

到达脚本末尾时,除非使用-n选项,否则模式空间的内容会打印到输出流中,重新添加尾随换行符< / strong>(如果已删除)。8然后,下一个循环开始于下一个输入行。

我特意夸大了与您的sed示例不起作用有关的部分。给出您的示例:

  • 他们似乎无视sed一次读取一行。
  • 您试图匹配的尾随换行符(分别在第一个和第二个示例中分别为\n\n\n\n\n)实际上并不存在。在执行您的regexp模式时已将它们删除,然后在到达脚本末尾时将其恢复。

答案 1 :(得分:0)

如果您的行仅由换行符(换行符或 \n)终止,RobC 的回答就很好,因为 SED 以这种方式分隔行。如果您的行由 \r\n(或 CRLF)终止 - 即使在 unix 系统上您也可能有这样做的原因 - 您将无法获得匹配项,因为从 sed 的角度来看,该行不是空的 - \r (CR) 算作一个字符。相反,您可以尝试:

sed '/^\r$/d' filename

说明:

  • ^ 匹配行首
  • \r 匹配回车
  • $ 匹配行尾
  • d 删除选定的行。
  • filename 是输入文件的路径。