我的文件中有一个数据为{{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