我有一个包含多行文本的文件,所有文本均以六个十六进制数字开头,一个空格,然后是一些文本。有时,此残留文本以字符
X
或 Y
开头,后跟 4 位数字和冒号。示例:
72a0bf Lorem ipsum dolor sit amet, consectetur adipiscing elit.
703e80 X-2310: Duis nibh sem, sollicitudin vel nulla eu, facilisis pulvinar purus.
21b6ac Nam ornare blandit consequat. Vivamus tincidunt eros consequat, egestas
8961cb Y-0110: dui at, lobortis nibh. Sed sed felis vel felis euismod dapibus in vel erat.
ce5dfe X-2310: Curabitur facilisis felis nec ante euismod ultricies at eget turpis. Duis
fa5e8b ac dui ut elit volutpat accumsan quis quis justo. Donec luctus suscipit sem,
我的目标是找到这些
X***
和 Y***
字符串的所有唯一实例。现在,如果我的所有记录都是上述形式,则可以通过例如一些 grep
、awk
和其他 bash
工具来实现:
$ cat file.txt | grep -E '^[a-z|0-9]{6}[[:space:]](X|Y)-[0-9]{4}' | awk '{print substr($2, 1, length($2) -1)}' | sort | uniq
X-2310
Y-0110
问题是,在 do 包含此模式的一些记录中,我正在
grep
ping(并且仅),不幸的是,我里面有一些 X***
和
Y***
字符串的实例剩余文本,这些实例可以是 1, 2, 3,...任何数字:
c8edc6 X-0101: at tempor tellus commodo sit amet. X-2489 Nunc id gravida est, in rhoncus metus.
fa5e8b Y-9410: ac X-1320 X-0101 dui ut elit Y-9416 volutpat accumsan X-0101 quis X-2000 quis justo.
e29ac0 Y-5751: Vivamus Y-0110 vehicula Y-2021 dolor X-0101 a pretium.
这给我上面的脚本带来了麻烦,因为我只是在寻找行首附近的模式。我希望能够找到字符串 X***
和 Y***
的那些实例的all
。有任何想法吗?唯一的限制是,由于环境限制,它必须是一个
bash
解决方案。
$ grep -E --only-matching '(X|Y)-[0-9]{4}' file.txt | sort | uniq