我在文件中有一行,如下所示
abcd x 10.10.10.10
有时同一行可能会有一些额外的字段,如下面的
abcd 123 AB x 10.10.10.10
所以现在我必须从文件中删除这一行。我的匹配模式是在一行中搜索abcd,x和10.10.10.10并删除它,因为这些是唯一的固定值。有没有办法匹配多个模式与逻辑和sed并删除该行?我尝试过使用正则表达式,但由于这里的模式并不总是相同,所以不起作用。我需要一个sed的解决方案。我试图搜索其他网站和stackoverflow。找不到任何适合我的解决方案。
答案 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
这是当前行的副本。然后将必填字段附加到由换行符分隔的行的末尾。使用替换和反向引用,匹配字段将从模式空间中删除,直到无法进一步匹配为止。如果剩下的字符串只包含由换行符分隔的零个或多个空格,则会标识要删除的行,否则将保留该行以便复制该副本。