Regex 如何在shell中使用正则表达式捕获此特定字符串?
我有一段文字:Regex 如何在shell中使用正则表达式捕获此特定字符串?,regex,linux,bash,shell,grep,Regex,Linux,Bash,Shell,Grep,我有一段文字: +--------------------------------------+ | ID | +--------------------------------------+ | cb91a52f-f0dd-443a-adfe-84c5c685d9b3 | | 184564aa-9a7d-48ef-b8f0-ff9d51987e71 | | f01f9739-c7a7-404c-8789-4e3e2edf314
+--------------------------------------+
| ID |
+--------------------------------------+
| cb91a52f-f0dd-443a-adfe-84c5c685d9b3 |
| 184564aa-9a7d-48ef-b8f0-ff9d51987e71 |
| f01f9739-c7a7-404c-8789-4e3e2edf314e |
| 825925cc-a816-4434-8b4b-a75301ddaefd |
| 5b1b0ec1-9c7e-4852-bbb7-b1c883c2acce |
| fec4a447-9f51-4796-9c92-42268cd21ad1 |
| 77b37392-c5f8-4537-8e2b-971f6b161dec |
| e8524cf0-47d4-43f8-aee3-2af03f511ebe |
| 2a6640e2-bfdf-416c-8d86-e2127802779a |
| 0223ac3d-2f99-42ab-b6be-cc738e5e3e25 |
| d3577eb1-c8cb-4328-bf5f-48cb2ef43229 |
| f46ed4c1-9325-4d35-8dda-18d2af31a510 |
| 311bc474-5747-4408-9124-6fa3a24c08c1 |
| 81ebddc6-612f-4675-9004-80c35207e1e3 |
| 09518994-7b37-481c-b058-d74c16d4c198 |
| 1e318d02-afd4-4b97-85d8-8c8f8b007144 |
| c220fae1-5a56-485f-ad51-0e0316bc105c |
| afbef917-2ee8-4eb9-948d-48fcd5ffc6e4 |
| cc8a6692-2ba9-4203-bf50-b02a8e4a0f21 |
| f49089be-4b2a-4b10-bfbd-495001e64f54 |
| d89b0b19-0f26-4b9a-8a9a-25a41f59cee5 |
| 18f1717f-74ac-429a-ba2b-4466489a2558 |
| 7560d8b2-3e3d-474c-bcf8-ded378d50954 |
| 1b02c8f9-6077-4499-93f6-bc04d8b0ca3a |
| 9ca256b4-c9eb-4a60-8fb5-dfe4ea883e1f |
| 3c837469-aa82-41ac-b75e-9bb087501789 |
| e151d2c7-5360-466c-857f-7474eec4eaeb |
| c7ca1066-c077-4846-aae0-56d7fc63c32d |
| 034026df-9e45-49e1-ab41-0ad3f4e5e33b |
| 45bb533d-ff92-419e-8523-bb4c9889a04e |
+--------------------------------------+
**** Total: 30 ****
我想捕捉这样的台词:
| cb91a52f-f0dd-443a-adfe-84c5c685d9b3 |
check_vm_connectivity()
{
res=`cat temp.txt` # this got text above
re='^\| [a-z0-9\-]+ \|'
for line in "$res"
do
if [[ "${line}" =~ $re ]] ; then
echo "${line}"
fi
done
}
它是“|UUID|”
所以我用的是这样的正则表达式:
| cb91a52f-f0dd-443a-adfe-84c5c685d9b3 |
check_vm_connectivity()
{
res=`cat temp.txt` # this got text above
re='^\| [a-z0-9\-]+ \|'
for line in "$res"
do
if [[ "${line}" =~ $re ]] ; then
echo "${line}"
fi
done
}
^\\\\[a-z0-9\-]+\\\\\\
是我经常使用的,但是结果捕获了所有行,我不知道出了什么问题?这是因为我应该将“改为”?以下命令是否就是您要查找的命令:
grep -oP "^\|\s*\w{8}-\w{4}-\w{4}-\w{4}-\w{12}\s*\|$" input.file | grep -v '_'
在输入文件上输出:
| cb91a52f-f0dd-443a-adfe-84c5c685d9b3 |
| 184564aa-9a7d-48ef-b8f0-ff9d51987e71 |
| f01f9739-c7a7-404c-8789-4e3e2edf314e |
| 825925cc-a816-4434-8b4b-a75301ddaefd |
| 5b1b0ec1-9c7e-4852-bbb7-b1c883c2acce |
| fec4a447-9f51-4796-9c92-42268cd21ad1 |
| 77b37392-c5f8-4537-8e2b-971f6b161dec |
| e8524cf0-47d4-43f8-aee3-2af03f511ebe |
| 2a6640e2-bfdf-416c-8d86-e2127802779a |
| 0223ac3d-2f99-42ab-b6be-cc738e5e3e25 |
| d3577eb1-c8cb-4328-bf5f-48cb2ef43229 |
| f46ed4c1-9325-4d35-8dda-18d2af31a510 |
| 311bc474-5747-4408-9124-6fa3a24c08c1 |
| 81ebddc6-612f-4675-9004-80c35207e1e3 |
| 09518994-7b37-481c-b058-d74c16d4c198 |
| 1e318d02-afd4-4b97-85d8-8c8f8b007144 |
| c220fae1-5a56-485f-ad51-0e0316bc105c |
| afbef917-2ee8-4eb9-948d-48fcd5ffc6e4 |
| cc8a6692-2ba9-4203-bf50-b02a8e4a0f21 |
| f49089be-4b2a-4b10-bfbd-495001e64f54 |
| d89b0b19-0f26-4b9a-8a9a-25a41f59cee5 |
| 18f1717f-74ac-429a-ba2b-4466489a2558 |
| 7560d8b2-3e3d-474c-bcf8-ded378d50954 |
| 1b02c8f9-6077-4499-93f6-bc04d8b0ca3a |
| 9ca256b4-c9eb-4a60-8fb5-dfe4ea883e1f |
| 3c837469-aa82-41ac-b75e-9bb087501789 |
| e151d2c7-5360-466c-857f-7474eec4eaeb |
| c7ca1066-c077-4846-aae0-56d7fc63c32d |
| 034026df-9e45-49e1-ab41-0ad3f4e5e33b |
| 45bb533d-ff92-419e-8523-bb4c9889a04e |
解释:
行的开头^
按字面意思匹配\\\124;
后跟0到N个空格字符\s*
其中\w{8}-\w{4}-\w{4}-\w{4}-\w{12}
是一个字的字符数、数字或下划线,\w
8表示正好出现8次,\w{8}
表示正好出现12次{12}
后跟0到N个空格字符\s*
按字面意思匹配\\\124;
用于行尾$
grep-v'
以删除带有
的行,如果您确信这些行不会包含这些行,那么这可能是不必要的
如果要提取UUID
,可以使用以下grep命令:
grep -oP "(?<=^\|\s)\w{8}-\w{4}-\w{4}-\w{4}-\w{12}(?=\s\|$)" input.file | grep -v '_'
cb91a52f-f0dd-443a-adfe-84c5c685d9b3
184564aa-9a7d-48ef-b8f0-ff9d51987e71
f01f9739-c7a7-404c-8789-4e3e2edf314e
825925cc-a816-4434-8b4b-a75301ddaefd
5b1b0ec1-9c7e-4852-bbb7-b1c883c2acce
fec4a447-9f51-4796-9c92-42268cd21ad1
77b37392-c5f8-4537-8e2b-971f6b161dec
e8524cf0-47d4-43f8-aee3-2af03f511ebe
2a6640e2-bfdf-416c-8d86-e2127802779a
0223ac3d-2f99-42ab-b6be-cc738e5e3e25
d3577eb1-c8cb-4328-bf5f-48cb2ef43229
f46ed4c1-9325-4d35-8dda-18d2af31a510
311bc474-5747-4408-9124-6fa3a24c08c1
81ebddc6-612f-4675-9004-80c35207e1e3
09518994-7b37-481c-b058-d74c16d4c198
1e318d02-afd4-4b97-85d8-8c8f8b007144
c220fae1-5a56-485f-ad51-0e0316bc105c
afbef917-2ee8-4eb9-948d-48fcd5ffc6e4
cc8a6692-2ba9-4203-bf50-b02a8e4a0f21
f49089be-4b2a-4b10-bfbd-495001e64f54
d89b0b19-0f26-4b9a-8a9a-25a41f59cee5
18f1717f-74ac-429a-ba2b-4466489a2558
7560d8b2-3e3d-474c-bcf8-ded378d50954
1b02c8f9-6077-4499-93f6-bc04d8b0ca3a
9ca256b4-c9eb-4a60-8fb5-dfe4ea883e1f
3c837469-aa82-41ac-b75e-9bb087501789
e151d2c7-5360-466c-857f-7474eec4eaeb
c7ca1066-c077-4846-aae0-56d7fc63c32d
034026df-9e45-49e1-ab41-0ad3f4e5e33b
45bb533d-ff92-419e-8523-bb4c9889a04e
grep-oP”(?您的正则表达式re='^\\\\[a-z0-9\-]+\\\\\\”
很好,代码中的问题是for循环逐行遍历它
for line in "$res"
它只执行一次循环,而$res
的全部内容都在$line
内
这应该可以解决这个问题:
check_vm_connectivity() {
local re='^\| [a-z0-9\-]+ \|'
local line
while read line ; do
if [[ "${line}" =~ $re ]] ; then
echo "${line}"
fi
done <temp.txt
}
检查虚拟机连接(){
局部re='^\|[a-z0-9\-]+\\|'
本地线路
边读边做
如果[[“${line}”=~$re]];则
回显“${line}”
fi
完成了您正在捕获的行的唯一性吗?应该如何识别它?我要捕获的行是:“| UUID”|”。所以我使用了这样的正则表达式,但有一些错误,我不知道为什么…什么是UUID
,预期的输出如何匹配它?仍然不清楚$re是什么?发布预期的结果