所以我试图从变量中提取数据
var="hi hello HI high" # --> This is the input
我希望提取的模式保存在
中var2="hi" # --> this is the pattern to be matched
如果我的输入是变量var1
,那么它应该只提取var2
中的模式。
输出在技术上应该只有:
hi
它不应该拾取与模式部分匹配的其他字符串:
hi HI high
我尝试使用:
echo $var|sed "s/.*\($var2\).*/\1/p"
和
echo $var|grep "^$var2$"
它对我不起作用。
我还可以建议遵循POSIX标准的解决方案,因为我需要在Solaris和Linux中实现这个想法。
答案 0 :(得分:2)
如果我正确地解释了这个问题,你可能想要这个:
var2="hi"
re='\b(hi)\b'
var="hi hello HI=really"
[[ $var =~ $re ]] && echo "${BASH_REMATCH[1]}" || echo "no match"
hi
var="hi hello HI=really"
[[ $var =~ $re ]] && echo "${BASH_REMATCH[1]}" || echo "no match"
no match
=~
用于bash中的正则表达式匹配${BASH_REMATCH[1]}
代表捕获的组#1 \b
用于字边界(在OSX上使用[[:<:]]
和[[:>:]]
) 使用sed
:
sed "s/.*\<\($var2\)\>.*/\1/" <<< "$var"
hi
使用grep
:
grep -oE "$re" <<< "$var"
hi
答案 1 :(得分:1)
让我们逐步建立
> echo "hi hello HI=really" | grep -o "hi"
hi
为搜索模式创建变量
> var2="hi"; echo "hi hello HI=really" | grep -o "$var2"
hi
为源文本
创建另一个变量var2="hi"; var="hi hello HI=really"; echo "$var" | grep -o "$var2"
hi
但是,我不确定它的实用价值。也许如果你能说明你原来的问题,你会得到更多有用的帮助。