捕获双括号之间的值

捕获双括号之间的值

我的文件中有一个数据为{{1,department}}.

我需要捕获如下所示的值:

val1=1
val2=department

我尝试使用 awk 命令使用单个 {} 获取数据,它有效。但对于 double {{}} 该命令不起作用。

我使用的命令是:

`var1=`echo $line | awk -F '[{}]' '{print $2}' | awk -F '[,]' '{print $1}'

答案1

使用 GNUgrep和任何 POSIX shell:

out=$(grep -Po '\{\{\K.*?(?=\}\})' < your-file)
val1=${out%%,*}
val2=${out#*,}
  • -P: 告诉grep使用 perl 兼容的正则表达式作为它的\K(?=)运算符
  • \K:设置开始价值。a\Kb匹配ab但返回b.所以在这里,我们匹配{{...但仅返回以从输出中...排除。{{
  • (?=...)为 实现同样的效果}}。这是一个先行运算符,如果...匹配则与 0 宽度匹配,但不...包含在返回值中
  • 所以$out最终是1,department.我们使用${var%%pattern}${var#pattern}标准 shell 运算符来提取第一个逗号之前和之后的部分。

假设该文件仅包含一次{{...}}出现并且至少包含一个逗号。

POSIXly,您可以将该grep命令替换为:

sed -n 's/.*{{\([^}]*\)}}.*/\1/p'

现在如果你有

some text {{1,department}} other text

在 shell 变量中,您还可以使用以下命令提取它:

  • zsh

    if [[ $string =~ '\{\{([^},]*),([^}]*)\}\}' ]]; then
      val1=$match[1] val2=$match[2]
    fi
    
  • bash

    if [[ $string =~ \{\{([^},]*),([^}]*)\}\} ]]; then
      val1=${BASH_REMATCH[1]} val2=${BASH_REMATCH[2]}
    fi
    

答案2

$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $3}'
department

$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $2}'
1

答案3

您可以使用以下命令打印值(带有前导空格):

$ echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF'
 1 department

这将允许读取值:

read val1 val2 <<<$(echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF')

这适用于一个括号和任何其他字段:

$ echo "{{1,department,name,list}}" | awk -F '[ {},]' 'NF=NF'
 1 department name list

grep 也可以提供类似的解决方案:

$ echo '{1,department}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department

$ echo '{{1,department}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department

$ echo '{{1,department,name,list}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department
name
list

shell 中的变量需要匹配确切的字段数量:

$ value='{{1,department}}'
$ re='\{\{([^},]*),([^}]*)\}\}'
$ [[ $value =~ $re ]] && echo "${BASH_REMATCH[@]:1}"
1 department

相关内容