2012-12-19 113 views
1

我想要得到的字符串<sometag param=''>获取字符串之间串在bash

之间我试图用的方法,从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

对于结构化数据,使用一个工具,它理解结构体。 'man xsltproc' – tripleee

回答

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

谢谢,基于grep的解决方案就是我一直在寻找的。 – Robby75

+0

FYI:最后的grep测试表达不与OS X 10.11 grep的落实执行。一般来说,它可能不适用于BSD。它在Ubuntu上工作。 :) –

0

您不必组装正则表达式在这种情况下,你可以使用'作为字段分隔

in="<sometag param='x'><irrelevant stuff='nonsense'>" 

IFS="'" read x whatiwant y <<< "$in"   # bash 
echo "$whatiwant" 

awk -F\' '{print $2}' <<< "$in"     # awk 
相关问题