RegEx для сопоставления символов в квадратных скобках в bash - PullRequest
1 голос
/ 08 мая 2019

Мне нужно реализовать мои регулярные выражения для некоторых символов в квадратных скобках:
1) [+] для этого
2) [*] и для этого
3) [+/*] и для этого
4) [*/+] и для этого

Я сделал это на bash:

[root@testmachine5 ~]# echo "[+]" | egrep -o "^\[(\+|\*|\+/\*)\]"
[+]
[root@testmachine5 ~]# echo "[*]" | egrep -o "^\[(\+|\*|\+/\*)\]"
[*]
[root@testmachine5 ~]# echo "[+/*]" | egrep -o "^\[(\+|\*|\+/\*)\]"
[+/*]
[root@testmachine5 ~]# echo "[*/+]" | egrep -o "^\[(\+|\*|\+/\*)\]"
[root@testmachine5 ~]#

Как видите, работает, в первом, втором и третьем вариантах.Но это не работает в последнем варианте.

Как мне решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Для последнего утверждения вы должны добавить еще одну опцию к чередованию , чтобы обратная версия соответствовала. Вы можете объединить первые 2 варианта с классом персонажа:

echo "[*/+]" | egrep -o "^\[([+*]|\+/\*|\*\/\+)\]"
                             ^^^^       ^^^^^^ 

Regex demo | Bash demo

1 голос
/ 08 мая 2019

Более общее регулярное выражение:

lynx@bionic:~/$ echo "[*]..[*]..[+/*]..[*/+]" | egrep -o "\[([*/+]{1,3})\]"
[*]
[*]
[+/*]
[*/+]

Или вот так

lynx@bionic:~$ echo "[*/+]" | grep -Po "(?<=\[)([*/+]{1,3})(?=\])"
*/+
1 голос
/ 08 мая 2019

Между квадратными скобками соответствует +, за которым необязательно следует /*, или *, за которым следует /+.

$ egrep -o '\[(\+(/\*)?|\*(/\+)?)\]' <<EOF
[+]
[/]
[*]
[+/*]
[*/*]
[/+*]
[*/+]
EOF
[+]
[*]
[+/*]
[*/+]
...