我有一个包含文字的变量;我可以回应stdout所以我认为变量很好。我的问题是试图在该变量的文本中grep一个模式。这是我正在尝试的:
ERR_COUNT=`echo $VAR_WITH_TEXT | grep "ERROR total: (\d+)"`
当我回显$ 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:”之后)提取到一个变量中,我很难哈哈。
干杯
答案 0 :(得分:6)
您可以使用bash的=~
运算符来提取值。
[[ $VAR_WITH_TEXT =~ ERROR\ total:\ ([0-9]+) ]]
请注意,您必须转义空格,或仅引用 正则表达式的固定部分:
[[ $VAR_WITH_TEXT =~ "ERROR total: "([0-9]+) ]]
因为引用任何元字符会导致它们被处理 字面上。
您还可以将正则表达式保存在变量中:
regex="ERROR total: ([0-9]+)"
[[ $VAR_WITH_TEXT =~ $regex ]]
在任何情况下,表达式匹配后,带括号的表达式
可以在BASH_REMATCH
数组中找到。
ERR_COUNT=${BASH_REMATCH[1]}
(第0个元素包含整个匹配的正则表达式;括号中的子表达式按照它们在完整正则表达式中出现的顺序在其余元素中找到。)
如果你想使用grep
,你需要一个可以接受Perl风格的正则表达式的版本。
ERR_COUNT=$( echo "$VAR_WITH_TEXT" | grep -Po "(?<=ERROR total: )\d+" )
只要您需要使用Perl样式的正则表达式启用后台断言,您就可以将[0-9]
替换为\d
。
答案 1 :(得分:3)
您的错误符合以下模式:(\d+)
匹配:
'('
'+'
')'
根据您的评论,您想要的是\(\d\+\)
,其中:
\( ... \)
定义子模式
\+
)数字(\d
)。在这种情况下,如果您不需要子模式,则可以放弃\(
和\)
。
注意:如果您的grep
无法理解\d
,则可以将其替换为[0-9]
。最简单的方法是编写grep '\d'
并通过编写几个测试行来测试它。
答案 2 :(得分:1)
# setting example data
test="adfa\nfasetrfaqwe\ndsfa ERROR total: 32514235dsfaewrf"
一个解决方案:
echo $(sed -n 's/^.*ERROR total: \([0-9]*\).*$/\1/p' < <(echo $test))
32514235
其他解决方案:
# throw away everything up to "ERROR total: "
test=${test##*ERROR total: }
# cut from behind assuming number contains no spaces and is
# separated by space
test=${test%% *}
echo $test
32514235
答案 3 :(得分:1)
\d
可能只在perl regex模式中被识别为数字,您可能想要使用grep -P
。
如果您只想要号码,请尝试:
ERR_COUNT=$(echo $VAR_WITH_TEXT | perl -pe "s/.*ERROR total: (\d+).*/\1/g")
或:
ERR_COUNT=$(echo $VAR_WITH_TEXT | sed -n "s/.*ERROR total: ([0-9]+).*/\1/gp")