使用正则表达式在分隔符之间获取内容

时间:2014-04-27 14:07:50

标签: regex bash

我试图从寄存器中提取中间值,如下所示:

NAME=PATH=USER=DATE

我需要获得路径部分,我想出的就是:

=[^=]*=

问题是它在开头和结尾包括=。我怎么能不包括它们?

另外,我应该使用哪个unix命令来提取它?我在想sed,但我通常用它来代替字符串而不是获取它们。 grep也许?

我是bash编程的新手......

有什么地方可以学习一些正则表达式吗?因为我认为我需要真正知道如何使用它们。

7 个答案:

答案 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;位)。它很丑陋,可能有更多有效的方法,但我认为你是从我的同一点开始的,我认为这是你的下一步。