JDS*_*JDS 2 regex string bash grep
我有一个包含文本的变量; 我可以回应stdout所以我认为变量很好.我的问题是试图在该变量的文本中grep一个模式.这是我正在尝试的:
ERR_COUNT=`echo $VAR_WITH_TEXT | grep "ERROR total: (\d+)"`
Run Code Online (Sandbox Code Playgroud)
当我回显$ ERR_COUNT时,变量似乎是空的,所以我一定做错了.
怎么做得好?谢谢.
编辑 - 只是想提一下,在变量中的示例文本上测试该模式确实给了我一些东西(我测试过:http://rubular.com)
然而,正则表达式可能仍然是错误的.
EDIT2 - 还没有得到任何结果,所以这里是我正在使用的字符串:
ALERT line125: Alert: Cannot locate any description for 'asdf' in the qwer.xml hierarchy. (due to (?i-xsm:\balert?\b) ALERT in ../hgfd.controls) ALERT line126: Alert: Cannot locate any description for 'zxcv' in the qwer.xml hierarchy. (due to (?i-xsm:\balert?\b) ALERT in ../dfhg.controls) ALERT line127: Alert: Cannot locate any description for 'rtyu' in the qwer.xml hierarchy. (due to (?i-xsm:\balert?\b) ALERT in ../kjgh.controls) [1] 22280 IGNORE total: 0 WARN total: 0 ALERT total: 3 ERROR total: 23 [1] + Done /tool/pandora/bin/gvim -u NONE -U NONE -nRN -c runtime! plugin/**/*.vim -bg ...
那是字符串,所以希望不再有歧义...我想把数字"23"(在"ERROR total:"之后)提取到一个变量中,我很难哈哈.
干杯
您可以使用bash的=~运算符来提取值.
[[ $VAR_WITH_TEXT =~ ERROR\ total:\ ([0-9]+) ]]
Run Code Online (Sandbox Code Playgroud)
请注意,您必须转义空格,或仅引用正则表达式的固定部分:
[[ $VAR_WITH_TEXT =~ "ERROR total: "([0-9]+) ]]
Run Code Online (Sandbox Code Playgroud)
因为引用任何元字符会导致它们被字面上对待.
您还可以将正则表达式保存在变量中:
regex="ERROR total: ([0-9]+)"
[[ $VAR_WITH_TEXT =~ $regex ]]
Run Code Online (Sandbox Code Playgroud)
在任何情况下,一旦表达式匹配,可以在BASH_REMATCH数组中找到带括号的表达式.
ERR_COUNT=${BASH_REMATCH[1]}
Run Code Online (Sandbox Code Playgroud)
(第0个元素包含整个匹配的正则表达式;括号中的子表达式按照它们在完整正则表达式中出现的顺序在其余元素中找到.)
如果你想使用grep,你需要一个可以接受Perl风格的正则表达式的版本.
ERR_COUNT=$( echo "$VAR_WITH_TEXT" | grep -Po "(?<=ERROR total: )\d+" )
Run Code Online (Sandbox Code Playgroud)
只要您需要使用Perl样式的正则表达式来启用后台断言,您就可以替换[0-9]为\d.