使用sed删除包含特定正则表达式的文件中的所有行

3

我们想要删除所有与以下“正则表达式输入”匹配的行,并将它们放入一个新文件中:

Hi|thisisatest|11

我们拥有什么:

check='([^[:space:]]+)|([^[:space:]]+)|([^[:space:]]+)'
sed '/$check/d' test.txt > test_new.txt

目前它不起作用。

编辑:

我们得到了以下的test.txt文件:

Jack|Miles|44
Carl|13
Robert|Whittaker|87
John|2
Frank|65

我们希望删除匹配正则表达式的Jack|Miles|44Robert|Whittaker|87。(如果正则表达式正确)
4个回答

2

正确的BRE正则表达式是:

check='[^[:space:]]*|[^[:space:]]*|[^[:space:]]*'

然后可以将其用作:
sed "/$check/d" file
Carl|13
John|2
Frank|65

顺便提一下,awk可以更好地处理它,而不需要使用正则表达式。只需使用|作为分隔符,并删除所有没有2个字段的行:

awk -F '|' 'NF==2' file

Carl|13
John|2
Frank|65

1
非常完美,非常感谢。我会在几分钟内将其作为答案进行检查。 - Frank Stone
一个小问题:如何将排序后的数字仅输出到文件中?例如从Robert|Whittaker|87 - 将"87"输出到numbers.txt。 - Frank Stone
1
awk -F '|' 'NF==2{print $2}' file > output.txt - anubhava
通过这种方式,我们从Carl、John和Frank那里得到了13、2和65,但我们需要的是我们筛选出来的(删除的)数字 :) - Frank Stone
几乎正确。现在我们得到了“Miles”和“Whittaker”,但没有数字;) 最终方法?/编辑 - Frank Stone
1
明白了,这是 awk -F '|' 'NF>2{print $3}' file > output.txt 命令。谢谢您的时间! :) - Frank Stone

2
使用 awk 更简单,只需执行以下命令:
awk -F'|' 'NF<=2' file
Carl|13
John|2
Frank|65

要使用更新后的内容修改同一文件,只需执行以下操作:

awk -F'|' 'NF<=2' file > tmp && mv tmp file

1
非常感谢。anubhava的回答更详细,所以我会将其选为我的问题的正确答案。但是你的也很好 :) - Frank Stone
1
我会这样做的 ;) - Frank Stone

1
使用GNU sed:

sed -r '/\S+\|\S+\|\S+/d' file 

0

还有一个 grep

grep -P '^\w+\|\d+$' file >tmp

从文件中选择“正确”的条目,例如word|digits

或者

grep -P '^[^|]+\|[^|]+$' file >tmp

并将tmp重命名为file


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接