Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 基于存储在变量中的字符串的精确匹配提取数据_Bash_Unix_Sed_Grep - Fatal编程技术网

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

Bash 基于存储在变量中的字符串的精确匹配提取数据,bash,unix,sed,grep,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\).*/\

所以我试着从一个变量中提取数据

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"
以及:

这对我不起作用


另外,请您推荐遵循POSIX标准的解决方案,因为我需要在Solaris和Linux中实现这一想法。

如果我正确地解释了这个问题,您可能需要:

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

如果我对这个问题的解释正确,你可能会想知道:

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

如果我对这个问题的解释正确,你可能会想知道:

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

如果我对这个问题的解释正确,你可能会想知道:

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

让我们一步一步地建立起来

> 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

但我不确定它的实用价值。如果你能说出你原来的问题,也许你会得到更多有用的帮助。

让我们一步一步地建立起来

> 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

但我不确定它的实用价值。如果你能说出你原来的问题,也许你会得到更多有用的帮助。

让我们一步一步地建立起来

> 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

但我不确定它的实用价值。如果你能说出你原来的问题,也许你会得到更多有用的帮助。

让我们一步一步地建立起来

> 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

但我不确定它的实用价值。如果您能说明您原来的问题,您可能会得到更多有用的帮助。

因此,给定
var=“abcd abcd2 abcdz=abcds”
您希望提取
abcd
作为参数。你要么选择了太相似的名字,要么我的眼睛累了,但我看不出有什么不同。此外,考虑一个固定格式。我希望这不是太混乱现在.. <代码> O/P应该只提取搜索模式在VAR2。< /代码>。这也不清楚。显示给定输入的输出。因此给定
var=“abcd abcd2 abcdz=abcds”
您希望提取
abcd
给定
abcd
作为参数。你要么选择了太相似的名字,要么我的眼睛累了,但我看不出有什么不同。此外,考虑一个固定格式。我希望这不是太混乱现在.. <代码> O/P应该只提取搜索模式在VAR2。< /代码>。这也不清楚。显示给定输入的输出。因此给定
var=“abcd abcd2 abcdz=abcds”
您希望提取
abcd
给定
abcd
作为参数。你要么选择了太相似的名字,要么我的眼睛累了,但我看不出有什么不同。此外,考虑一个固定格式。我希望这不是太混乱现在.. <代码> O/P应该只提取搜索模式在VAR2。< /代码>。这也不清楚。显示给定输入的输出。因此给定
var=“abcd abcd2 abcdz=abcds”
您希望提取
abcd
给定
abcd
作为参数。你要么选择了太相似的名字,要么我的眼睛累了,但我看不出有什么不同。此外,考虑一个固定格式。我希望这不是太混乱现在.. <代码> O/P应该只提取搜索模式在VAR2。< /代码>。这也不清楚。显示给定输入的输出。我认为grep-O在Linux中不可用,如果我错了,请纠正我。。虽然这个想法非常有效,但有没有等效的解决方案?它是lowecase“o”。我很怀疑你的发行版上没有。这是GNU工具,我的错。它工作正常,@Karakfa。正如你所说的小写“o”,我认为grep-o在Linux中是不可用的,如果我错了,请纠正我。。虽然这个想法非常有效,但有没有等效的解决方案?它是lowecase“o”。我很怀疑你的发行版上没有。这是GNU工具,我的错。它工作正常,@Karakfa。正如你所说的小写“o”,我认为grep-o在Linux中是不可用的,如果我错了,请纠正我。。虽然这个想法非常有效,但有没有等效的解决方案?它是lowecase“o”。我很怀疑你的发行版上没有。这是GNU工具,我的错。它工作正常,@Karakfa。正如你所说的小写“o”,我认为grep-o在Linux中是不可用的,如果我错了,请纠正我。。虽然这个想法非常有效,但有没有等效的解决方案?它是lowecase“o”。我很怀疑你的发行版上没有。这是GNU工具,我的错。它正确地工作