regex - 如何在 shell 中使用正则捕获这个特定的字符串?

标签 regex linux bash shell grep

我有一条短信:

+--------------------------------------+
| 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 |

这是“| UUID |”

所以我像这样使用正则:

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 '_'

OUTPUT 在您的输入文件上:

| 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 |

解释:

  • ^行首
  • \| 按字面意思匹配 |
  • \s* 后接0到N个空格
  • \w{8}-\w{4}-\w{4}-\w{4}-\w{12} 其中 \w 是单词字符数,数字或下划线,\w{8} 8 表示正好出现 8 次,{12} 表示正好出现 12 次,... <
  • \s* 后接0到N个空格
  • \| 按字面匹配 |
  • $ 为行尾

然后以防万一我管道到 | 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

关于regex - 如何在 shell 中使用正则捕获这个特定的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49187744/

相关文章:

c++ - 如何编译(构建)我的 Qt 应用程序以在许多 Linux 发行版上运行?

linux - 如何从多个网页下载文本到文件?

python - 我用于查找非法 XML 字符的正则表达式在 Python 中非常慢

php - PHP 中的正则表达式 : find the first matching string

linux - 从 shell 脚本将 Azure CLI 作为 cron 作业执行

php - 从html上传文件中保存文件到/var/www

linux - bat to sh 翻译请

bash Grep 多行 "BID_1:****"并保存到 "****_name"其中 **** 是数字

php - 在 Laravel 4.2 中将小时转换为周、天、小时

c# - 正则表达式从邮件存档中提取 "From",包括名称和换行符