我想在<sometag param='
和'>
我尝试使用Get any string between 2 string and assign a variable in bash中的方法来获取“x”:
echo "<sometag param='x'><irrelevant stuff='nonsense'>" | tr "'" _ | sed -n 's/.*<sometag param=_\(.*\)_>.*/\1/p'
问题(除了效率低,因为我无法正确地为sed设法逃避撇号)是sed匹配最大值,即输出为:
x_><irrelevant stuff=_nonsense
但正确的输出是最小匹配,在本例中只是“x”
感谢您的帮助
答案 0 :(得分:3)
你可能正在寻找这样的东西:
sed -n "s/.*<sometag param='\([^']*\)'>.*/\1/p"
测试:
echo "<sometag param='x'><irrelevant stuff='nonsense'>" | sed -n "s/.*<sometag param='\([^']*\)'>.*/\1/p"
结果:
x
说明:
[^']*
,这意味着除了'
之外的任何次都匹配。为了使图案粘住,接下来是:'>
。-
... | sed -n 's/.*<sometag param='\''\([^'\'']*\)'\''>.*/\1/p'
请注意单引号是如何实际转义的。 sed
表达式停止,插入转义单引号并重新打开sed
表达式。可以把它想象成四个字符的转义序列。
就个人而言,我会使用GNU grep
。它会缩短解决方案。像:
... | grep -oP "(?<=<sometag param=').*?(?='>)"
测试:
echo "<sometag param='x'><irrelevant stuff='nonsense'>" | grep -oP "(?<=<sometag param=').*?(?='>)"
结果:
x
答案 1 :(得分:0)
在这种情况下你不必组装正则表达式,你可以使用&#39;作为字段分隔符
in="<sometag param='x'><irrelevant stuff='nonsense'>"
IFS="'" read x whatiwant y <<< "$in" # bash
echo "$whatiwant"
awk -F\' '{print $2}' <<< "$in" # awk