在bash中获取字符串之间的字符串

时间:2012-12-19 05:30:02

标签: bash sed

我想在<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”

感谢您的帮助

2 个答案:

答案 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