如何使用 sed 删除包含超过 1 个单词的行?

如何使用 sed 删除包含超过 1 个单词的行?

我需要从文件中删除包含 > 1 个单词的行。以下是文件内容的示例:

This
line is
not
what I need
printed-now.

将打印

This
not
printed-now.

我努力了:

sed -n '/[a-zA-Z]* *[a-zA-Z]/p'

这是一个令我困惑的学习活动。

答案1

sed可以使用这个:

sed -i '/\w .*/d' file

或者,如果第一个单词可以包含除空格之外的任何内容:

sed -i '/\S .*/d' file
  • -i:就地修改文件。
  • /\w .*/d:如果模式/\w .*/(即一个单词、一个空格以及其后的所有内容)匹配,则删除(d末尾)整行。
  • /\S .*/d:如果模式/\S .*/(即除空格、空格和其后的所有内容之外的任何内容)匹配,则删除(d末尾)整行。

您可以使用 做很多事情awk。在以下所有情况下,-i inplace用于就地修改文件:

  1. 仅打印没有第二个字段的行:

    awk -i inplace '!$2' file
    
  2. 仅打印第二个字段为空的行:

    awk -i inplace '$2 == ""' file
    
  3. 仅打印字段数(NF)小于 2(等于 1)的行(感谢steeldriver!):

    awk -i inplace 'NF<2' file
    

    或者

    awk -i inplace 'NF==1' file
    
  4. 仅打印第二个字段的长度不为零的行:

    awk -i inplace '!length($2)' file
    

笔记-i inplace标志仅适用于awk4.1 以上的版本。对于低于此版本的版本,等效操作是先保存到中间文件,然后将此文件重命名为初始文件。例如,第一个选项将是这样的:

awk '!$2' file > tmp && mv tmp file

在所有情况下,输出都是这样的:

This
not
printed-now.

答案2

我会用:

sed -E '/\S\s+\S/d' <Data.txt

(即,包含非空格内容的行,后跟任意数量的空格,后跟非空格内容)。

One
Item
Per line
This disappears
This also disappears
This-remains
  Leading-space
Trailing-spaces   

变成:

One
Item
This-remains
  Leading-space
Trailing-spaces   

答案3

使用

sed -i '/what I need/c\ ' filename

基本上它遵循以下方法-

sed -i '/pattern/c\ line_you_want_to_insert' filename    

这里 line_you_want_to_insert 将为空白,因为您想将其删除。

相关内容