替换文件中的类似字符串

时间:2012-12-26 10:16:09

标签: regex macos shell sed grep

我有一个包含以下类型的字符串对的文件:

Call Stack: [UniqueObject1] | [UnOb2] | [SuspectedObject1] | [SuspectedObject2] | [SuspectedObject3] |  [UnOb3] | [UnOb4] | [UnOb5] | ... end till unique objects

Call Stack: [UniqueObject1] | [UnOb2] | 0x28798765 | 0x18793765 | 0x48792767 |  [UnOb3] | [UnOb4] | [UnOb5] | ... end till unique objects

文件中出现了很多这样的对。 该对的属性是该对的第一部分具有“SuspectedObject1”,“SuspectedObject2”等等,该对的第二部分被这些对象的地址的HEX-VALUES替换。

我想要做的是,删除所有第二部分。

请注意,这些对不会以任何特定的顺序出现,并且可能会被它们之间的多行隔开。

我打算遍历这个文件的每一行,如果我看到一个十六进制字符串作为地址而不是一个可疑对象,我想开始比较下面的正则表达式

Call Stack: [UniqueObject1] | [UnOb2] | * | * | * |  [UnOb3] | [UnOb4] | [UnOb5] | ... end till unique objects

在整个文件中,如果字符串匹配,我想从文件中删除此特定行。

有人可以提出shell方法吗?

1 个答案:

答案 0 :(得分:0)

如果我已正确理解您的问题,您可能需要使用awk。像:

一样运行
awk -f script.awk file file

script.awk的内容:

BEGIN { 
    FS=" \\| "
}

FNR==NR {
    $3=$4=$5=""
    a[$0]++
    next
}

$3 ~ /^0x[0-9]{8}$/ {
    r=$0
    $3=$4=$5="" 
    if (a[$0]<2) { 
        print r
    }
    next
}1

或者,这是单行:

awk -F ' \\| ' 'FNR==NR { $3=$4=$5=""; a[$0]++; next } $3 ~ /^0x[0-9]{8}$/ { r=$0; $3=$4=$5=""; if (a[$0]<2) print r; next }1' file{,}