我需要从文件中删除包含 > 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
用于就地修改文件:
仅打印没有第二个字段的行:
awk -i inplace '!$2' file
仅打印第二个字段为空的行:
awk -i inplace '$2 == ""' file
仅打印字段数(
NF
)小于 2(等于 1)的行(感谢steeldriver!):awk -i inplace 'NF<2' file
或者
awk -i inplace 'NF==1' file
仅打印第二个字段的长度不为零的行:
awk -i inplace '!length($2)' file
笔记此-i inplace
标志仅适用于awk
4.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 将为空白,因为您想将其删除。