Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在shell中使用正则表达式捕获此特定字符串?_Regex_Linux_Bash_Shell_Grep - Fatal编程技术网

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;
    按字面意思匹配
  • \s*
    后跟0到N个空格字符
  • \w{8}-\w{4}-\w{4}-\w{4}-\w{12}
    其中
    \w
    是一个字的字符数、数字或下划线,
    \w{8}
    8表示正好出现8次,
    {12}
    表示正好出现12次
  • \s*
    后跟0到N个空格字符
  • \\\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是什么?发布预期的结果