我有一个包含以下类型的字符串对的文件:
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方法吗?
答案 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{,}