我试图从寄存器中提取中间值,如下所示:
NAME=PATH=USER=DATE
我需要获得路径部分,我想出的就是:
=[^=]*=
问题是它在开头和结尾包括=。我怎么能不包括它们?
另外,我应该使用哪个unix命令来提取它?我在想sed,但我通常用它来代替字符串而不是获取它们。 grep也许?
我是bash编程的新手......
有什么地方可以学习一些正则表达式吗?因为我认为我需要真正知道如何使用它们。
答案 0 :(得分:3)
使用捕获的组:
if [[ $str =~ =([^=]+)= ]]
then
echo "Part between = and = is ${BASH_REMATCH[1]}."
fi
答案 1 :(得分:2)
在bash中:
IFS="="
a="NAME=PATH=USER=DATE"
read -a b <<< "$a"
echo "${b[1]}"
按照mklement0
的建议进行更新a="NAME=PATH=USER=DATE"
IFS="=" read -a b <<< "$a"
echo "${b[1]}"
答案 2 :(得分:2)
为了有多种可能性,您还可以使用read
并使用所有字段创建数组:
var="NAME=PATH=USER=DATE"
IFS== read -r -a var_ary <<< "$var"
echo "field1: ${var_ary[0]}"
echo "field2: ${var_ary[1]}"
echo "field3: ${var_ary[2]}"
echo "field4: ${var_ary[3]}"
将输出:
field1: NAME
field2: PATH
field3: USER
field4: DATE
这也可以让您检查是否有正确数量的字段:
if ((${#var_ary[@]}==4)); then
echo "Cool I have 4 fields"
else
echo "Oh no, I don't have 4 fields (I have ${#var_ary[@]} fields)"
fi
答案 3 :(得分:2)
不需要复杂的正则表达式,简单的awk
可以做到:
echo "NAME=PATH=USER=DATE" | awk -F= '{print $2}'
PATH
答案 4 :(得分:1)
您可以使用bash
参数删除前导和尾随部分。
$ s='NAME=PATH=USER=DATE'
$ s=${s#*=} && echo "${s%%=*}"
PATH
%%
从后面删除最长的匹配,#
从前面删除最短的匹配。将它们结合使用可以删除不需要的部分。您可以详细了解bash
参数展开here。
答案 5 :(得分:1)
NAME = PATH = USER = DATE
提取此数据的多种方法。最简单的可能是模式过滤。模式过滤有四种形式:
${VAR#PATTERN}
- 删除与该模式匹配的字符串最左侧的最小部分。${VAR##PATTERN}
- 删除匹配字符串最左侧的最大部分。${VAR%PATTERN}
- 删除与匹配的字符串最右边的**部分。${VAR%%PATTERN}
- 删除与匹配的字符串最右边的最大。您可以记住,#
位于键盘上%
的左侧,因此#
已离开,%
正确。
STRING="NAME=PATH=USER=DATE"
PATH=${STRING#*=} # Removes NAME=
PATH=${PATH%%=*} # Removes =USER=DATE
echo $PATH # Echoes "PATH"
您可以使用read
一次性获取所有四个。我在iPad上,所以我现在无法对此进行测试。
OLD_IFS="$IFS"
IFS="="
read NAME PATH USER DATE <<<"$STRING"
IFS="$OLDIFS"
$IFS
是输入文件分隔符,默认情况下设置为 space / tab / NL 。我在更改之前保存$IFS
的值。我将其设置为=
,它将输入字符串中的各种值分开..
read
将使用$IFS
读取值以分隔每个值。 <<<
是一种将shell变量作为输入的方法。
获得值后,我重置了IFS
。否则,我以后会遇到问题。
答案 6 :(得分:0)
在Stackoverflow上启动正则表达式的好地方是:Reference - What does this regex mean?
对于您的实际问题 - 您正在寻找正则表达式以及在bash中使用它的方法:
josephs-mbp$more temp.txt
NAME=PATH=USER=DATE
josephs-mbp$sed 's/^.*=\([^=]*\)=.*=.*$/\1/' temp.txt
PATH
josephs-mbp$
让我们分解重要的一点。有时你想分别引用正则表达式的位,事实证明,这样做的简单方法是将东西放在括号中(&#39;&#39;)&#39; - 但在正则表达式的土地上,我们必须逃避它们,以便它们(&#39;和&#39;)。这些对比赛没有任何影响,但它们对现在发生的事情产生了影响。
一般来说,&#39;(&#39;和&#39;)&#39;之间的正则表达式位。存储在稍后可以使用\ 1,\ 2,...访问的位置,第一对存储在\ 1中,第二对存储在\ 1中,依此类推。在这里,我只需将您想要的正则表达式放入括号中,然后在sed中替换(即&#39; s / fu / bar&#39;位)。它很丑陋,可能有更多有效的方法,但我认为你是从我的同一点开始的,我认为这是你的下一步。