如何修正grep正则以提取DO-WHILE语句中的指定参数?
问题修正方案
你遇到的问题是因为grep -E的-o选项只会输出整个匹配的字符串,不会单独提取正则里的捕获组内容。要提取目标的四个参数,得用支持捕获组输出的正则模式,比如GNU grep的Perl兼容正则(-P选项),以下是具体解决方法:
分步提取各参数
1. 提取prog3
grep -oP 'DO\s+\K\S+' <<< 'DO prog3 WHILE prog1 arg1 arg2 <= prog2 arg1 END'
\K:重置匹配起点,忽略前面的DO和空格,只输出后面的非空白字符(即prog3)
2. 提取prog1 arg1 arg2
grep -oP 'WHILE\s+\K.*?(?=\s+[<>]=?\s+)' <<< 'DO prog3 WHILE prog1 arg1 arg2 <= prog2 arg1 END'
.*?:非贪婪匹配,避免匹配到运算符后面的内容(?=\s+[<>]=?\s+):正向预查,匹配到运算符(<=、<、>=、>)前停止
3. 提取运算符(如<=)
grep -oP '\s+\K[<>]=?(?=\s+)' <<< 'DO prog3 WHILE prog1 arg1 arg2 <= prog2 arg1 END'
[<>]=?:匹配所有常见比较运算符(<=、<、>=、>)
4. 提取prog2 arg1
grep -oP '[<>]=?\s+\K.*?(?=\s+END)' <<< 'DO prog3 WHILE prog1 arg1 arg2 <= prog2 arg1 END'
(?=\s+END):正向预查,匹配到END前停止
一次性提取所有参数(需结合sed)
如果想一次性输出所有参数,可先用grep匹配整个结构,再用sed提取捕获组:
echo 'DO prog3 WHILE prog1 arg1 arg2 <= prog2 arg1 END' | sed -E 's/DO (\S+) WHILE (.*) ([<>]=?) (.*) END/\1\n\2\n\3\n\4/'
输出结果:
prog3 prog1 arg1 arg2 <= prog2 arg1
内容的提问来源于stack exchange,提问作者Muhammad Yojer
相关产品推荐
相关产品推荐

