我有一个可能包含 GUID(它们的规范文本表示)。
我想对文件中的每个 GUID 执行一个操作。它可能包含任意数量的 GUID。
我已经准备好了一个文件可供阅读。如何发现 GUID?
我知道我需要使用while read FILENAME
我的文件的一个例子:
GUIDs
--------------------------------------
cf6e328c-c918-4d2f-80d3-71ecaf09bf7b
91d523b0-4926-456e-a9d2-ade713f5b07f
(2 rows)
// THERE IS AN EMPTY LINE HERE AFTER NUMBER OF ROWS
答案1
与 GNU 实现grep
(或兼容):
<your-file grep -Ewo '[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}' |
while IFS= read -r guid; do
your-action "$guid"
sleep 5
done
会在输入中的任何位置找到这些 GUID(前提是它们之前或之后都没有单词字符)。
GNUgrep
有一个-o
选项可以打印正则表达式的非空匹配。
-w
是另一个非标准扩展,我相信来自 SysV,仅匹配整个单词。仅当匹配文本介于非单词和单词字符之间的转换以及单词和非单词字符之间的转换(其中单词字符是字母数字或下划线)时,它才匹配。这是为了防止匹配以下内容:
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
其余部分是标准 POSIX 语法。请注意,[[:xdigit:]]
ABCDEF 也匹配。[0123456789abcdef]
如果您只想匹配小写 GUID,则可以将其替换为。
答案2
虽然我喜欢正则表达式,但我更喜欢避免过度指定。对于这个特定的数据集(已知的数据格式,每行一个 GUID,加上页眉和页脚),我只需删除页眉/页脚:
$ cat guids.txt | egrep -v 'GUIDs|--|rows|^$' |
while read guid ; do
some_command "$guid"
sleep 5
done
或者,我会 grep 出我想要的行,但也使当前数据集的正则表达式尽可能简单:
egrep '^[0-9a-f-]{36}$'