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

时间:2017-03-15 16:32:52

标签: regex bash sed

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

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 个答案:

答案 0 :(得分:2)

正确的BRE正则表达式是:

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

然后将其用作:

sed "/$check/d" file
Carl|13
John|2
Frank|65

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

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

Carl|13
John|2
Frank|65

答案 1 :(得分:2)

使用awk时更简单,只需要做,

awk -F'|' 'NF<=2' file
Carl|13
John|2
Frank|65

要使用更新修改同一文件,只需执行,

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

答案 2 :(得分:1)

使用GNU sed:

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

答案 3 :(得分:0)

还是grep

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

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

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

并将tmp重命名为file