1

我想得到和之间的<sometag param='字符串'>

我尝试使用Get any string between 2 string 中的方法并在 bash 中分配一个变量来获取“x”:

 echo "<sometag param='x'><irrelevant stuff='nonsense'>" | tr "'" _ | sed -n 's/.*<sometag param=_\(.*\)_>.*/\1/p'

问题(除了效率低,因为我无法为 sed 正确地转义撇号)是 sed 匹配最大值,即输出为:

 x_><irrelevant stuff=_nonsense

但正确的输出将是最小匹配,在这个例子中只是“x”

谢谢你的帮助

4

2 回答 2

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
于 2012-12-19T05:39:32.280 回答
0

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

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

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

awk -F\' '{print $2}' <<< "$in"                 # awk
于 2012-12-19T15:39:29.513 回答