如何匹配多个模式并使用sed删除一行?

时间:2015-11-28 17:26:49

标签: regex bash sed

我在文件中有一行,如下所示

abcd    x  10.10.10.10

有时同一行可能会有一些额外的字段,如下面的

abcd    123  AB  x  10.10.10.10

所以现在我必须从文件中删除这一行。我的匹配模式是在一行中搜索abcd,x和10.10.10.10并删除它,因为这些是唯一的固定值。有没有办法匹配多个模式与逻辑和sed并删除该行?我尝试过使用正则表达式,但由于这里的模式并不总是相同,所以不起作用。我需要一个sed的解决方案。我试图搜索其他网站和stackoverflow。找不到任何适合我的解决方案。

2 个答案:

答案 0 :(得分:2)

这是awk的工作,而不是sed:

$ cat tst.awk
BEGIN {
    split("abcd x 10.10.10.10",flds)
    for (idx in flds) {
        targets[flds[idx]]
    }
}
{
    delete cnt
    for (i=1;i<=NF;i++) {
        cnt[$i]++
    }

    for (fld in targets) {
        if (cnt[fld] == 1) {
            delete cnt[fld]
        }
    }

    for (fld in cnt) {
        # If we reach here then one or more of these conditions is true:
        # a) there was a field that is not one we targetted
        # b) there was a target field that occurred multiple times
        # c) a target field was missing
        print
        next
    }
}

$ awk -f tst.awk file
abcd    123  AB  x  10.10.10.10

由于awk在所有UNIX安装上都可用,就像sed一样,因此没有理由强迫自己尝试使用sed。

答案 1 :(得分:0)

这可能适合你(GNU sed);

sed -r 'h;s/$/\nabcd x 10.10.10.10/;ta;:a;s/(.+)(.*\n.*)\<\1\>/\2/;ta;/^\s*\n\s*$/d;x' file

这是当前行的副本。然后将必填字段附加到由换行符分隔的行的末尾。使用替换和反向引用,匹配字段将从模式空间中删除,直到无法进一步匹配为止。如果剩下的字符串只包含由换行符分隔的零个或多个空格,则会标识要删除的行,否则将保留该行以便复制该副本。