Unix删除包含多个破折号的行

时间:2014-04-30 09:11:30

标签: regex shell unix awk sed

我在一个文件中有大约1200万行,并且想要删除包含多个破折号的行。几个例子:

e--xa-mple
e-xa-mple

有任何可能的变化。 Sed,awk,grep或其他任何东西都可以工作。

提前多多感谢。

4 个答案:

答案 0 :(得分:6)

您可以使用设置短划线作为字段分隔符的字段数来播放:

awk -F- 'NF<=2' file

要替换当前文件,您可以执行以下操作:

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

解释

  • -F--设置为字段分隔符。
  • NF代表字段数。
  • 如果字段数为1或2,则
  • NF<=2为true,表示该行包含0或1个短划线。因此,它不会打印任何具有两个以上字段的行,即2个或更多个破折号。

测试

$ cat a
e--xa-mple
e-xa-mple
example
e-xample

$ awk -F- 'NF<=2' a
example
e-xample

答案 1 :(得分:5)

简单的sed:

sed '/-.*-/d' yourfile

或更快,避免在出现第二个破折号时扫描整条线:

sed '/-[^-]*-/d' yourfile

答案 2 :(得分:0)

使用单行perl

perl -ne "print unless /-.*-/" file

答案 3 :(得分:0)

我想有人应该把

grep -v '-.*-'

在这里,即使我亲自使用@Gilles Arcas的答案