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

如果使用sed找到pattern1和pattern2,则bash delete,bash,sed,pattern-matching,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

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

示例文件:

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

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

您可以使用
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
这是:

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

如果将sed与shell变量一起使用,请使用双引号:

sed "...$FOO...$BAR.." 
使用
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

您可以使用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`

不行,还是我做错了$Serie=“14003”awk'$5!=$系列和$4~/DC/'/home/etc/vartotals。tot@PedroCaldeira对我有用。你得到了什么结果。文件保持不变,没有行deleted@PedroCaldeira请参阅我更新的文章,了解如何将变量与
awk
awk-v=“$var1”'某些代码使用v'
awk'某些代码使用v'v=“$var1”
@pedrocaldera要更新文件,必须重定向输出:
awk'$5!=14003&&$4~/DC/'file>new_file
。我正在使用:if[$Series=“1”];然后sed/$Serie/{/DC/d}/home/etc/someone文件。。。fi@PedroCaldeira我清楚地回答说,如果你想在sed中使用shell变量,请用双引号引用sed表达式。是的,这意味着:sed“/$var1/{/$var2/d}”/path/file就是这样吗?它的工作原理是:sed-I/$Serie/DC/d/home/winrest/files/data/fdochash。000@PedroCaldeira我不知道你是否打了双引号。不管怎样,关键是它对你有用。那么good.sed/pattern1/pattern2/d不是有效的sed指令,而是2的miw。s/p1/p2/用p2替换p1和/p1/在找到p1时执行操作的操作(d是您行中的操作,但sed接受$var2)
#!/bin/ksh

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