基于存储在变量中的字符串的精确匹配来提取数据

时间:2015-08-10 14:07:23

标签: bash unix sed grep

所以我试图从变量中提取数据

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中实现这个想法。

2 个答案:

答案 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
但是,我不确定它的实用价值。也许如果你能说明你原来的问题,你会得到更多有用的帮助。