如果使用sed找到pattern1和pattern2,则删除bash

时间:2014-01-16 11:46:33

标签: bash sed pattern-matching

我需要删除文件中包含两个单独关键字的所有行

示例文件:

2  563587992014-01-26      2014-01-26T09:45:53     DC  14003 5         3.60
2  563589242014-01-26      2014-01-26T10:03:13     DC  14003 6         4.80
2  563589252014-01-26      2014-01-26T10:03:20     DC  14002 2         5.50
2  563589272014-01-26      2014-01-26T10:03:34     DC  14002 3         3.30

我想删除所有包含'DC'和'14003'的行。

我正在尝试使用sed

var1="DC"
var2="14003"

sed -i /$var1/$var2/d /path/file

但它不起作用。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

sed '/14003/{/DC/d}'

这样做:

  

删除所有包含“DC”和“14003”的行。

如果你使用sed和shell变量,请使用双引号:

sed "...$FOO...$BAR.." 

答案 1 :(得分:0)

你可以使用awk,这很简单:

$ awk '$5 != 14003 && $4~/DC/' file
2  563589252014-01-26      2014-01-26T10:03:20     DC  14002 2         5.50
2  563589272014-01-26      2014-01-26T10:03:34     DC  14002 3         3.30

要更新文件,您必须将输出重定向到新文件。然后,您可以使用mv

替换新的前者
awk '$5 != 14003 && $4~/DC/' file > new_file && mv new_file file

答案 2 :(得分:0)

使用awk

awk '!/DC/ || !/14003/' file
2  563589252014-01-26      2014-01-26T10:03:20     DC  14002 2         5.50
2  563589272014-01-26      2014-01-26T10:03:34     DC  14002 3         3.30

使用变量:

var1="DC"
var2="14003"
awk '$0!~v1 || $0!~v2' v1="$var1" v2="$var2" file
2  563589252014-01-26      2014-01-26T10:03:20     DC  14002 2         5.50
2  563589272014-01-26      2014-01-26T10:03:34     DC  14002 3         3.30

答案 3 :(得分:0)

您可以使用perl:

perl -i -lne 'print unless(/DC/ and  /14003/)' your_file

注意:这将替换现场。

如果您希望将其包含在shell脚本中,则可以使用以下方法:

#!/bin/ksh

one="DC"
two="14003"
three=`perl -i -lne "print unless(/$one/ and /$two/)" temp`
相关问题