Bash 在匹配文本后提取大括号内的字符串,并作为变量存储在中
我的文件中有几行,如下所示Bash 在匹配文本后提取大括号内的字符串,并作为变量存储在中,bash,shell,unix,awk,Bash,Shell,Unix,Awk,我的文件中有几行,如下所示 DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.SUN.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE 括号内的文本每行都会发生变化。我试图在
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.SUN.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE
括号内的文本每行都会发生变化。我试图在MANAGER(在本例中为SUN)之后提取括号内的文本,将其存储为变量,并将其替换为planet.SUN.star
我尝试使用awk字段分隔符提取括号之间的文本,并使用字段分隔符作为括号,但结果不一致。我有时不会在匹配的单词MANAGER之后得到括号内的文本
欲望输出如下图所示
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.SUN.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE
使用awk的解决方案:
echo "DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE" \
| awk '{
# Look for the field starting with MANAGER(
for ( I=1 ; I <= NF ; I++ ) {
if ( $I ~ /^MANAGER[(]/ ){
MANAGER = $I
break
}
}
# Remove everything except our value
sub( /^MANAGER[(]\x27/, "", MANAGER )
sub( /\x27[)]$/, "", MANAGER )
# Rebuild the line with the new value
$I = "MANAGER(\x27PLANET." MANAGER ".STAR\x27)"
print
}'
echo“DEF QR('xxx.yyy.sss')使用(是)描述('Something')管理器('SUN')名称('CAT')TRASMIT('TRUCK')替换”\
|awk'{
#查找以MANAGER开头的字段(
对于(I=1;I如果您选择Perl
,请尝试:
word="MANAGER"
replacement="PLANET.SUN.STAR"
perl -pe "s/(?<=${word}\(')(.+?)(?='\))/${replacement}/" <<< "DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE"
- 正则表达式
(?对于sed
和使用标准替换形式sed“s/find/replace/”
的捕获组和反向引用,这是相当简单的,其中find
包含捕获组”管理器('\(.^']*\)“:
和replace
使用反向引用\1
插入捕获的内容,例如
sed "s/MANAGER('\(.[^']*\)')/MANAGER('PLANET.\1.STAR')/"
通过您的示例,您将获得:
$ echo "DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE" | \
sed "s/MANAGER('\(.[^']*\)')/MANAGER('PLANET.\1.STAR')/"
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.SUN.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE
要在变量中捕获“SUN”
,可以使用命令替换以及grep-o
和类似的正则表达式,然后使用参数展开来修剪外部单引号,例如
var=$(echo "your_string" | grep -o "MANAGER('.[^']*')")
var="${var#*\'}"
var="${var%\'*}"
echo "var: $var"
输出结果:
var: SUN
用期望的输出更新原始问题太阳这个词每行都在变化。它可以是月亮或木星。你能通过添加几行来显示输入和期望的输出吗?我想知道在MANAGER被重新用作结果后,parens中的这个词是如何被使用的。好的,我已经用最好的猜测和假设更新了我的答案。希望t他的符合你的要求。我试过perl,效果很好。你能解释一下解决方案吗?很高兴知道它是有效的。我已经编辑了我的答案,为perl脚本添加了一些解释。希望对你有所帮助。
$ echo "DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('SUN') NAME('CAT') TRASMIT('TRUCK') REPLACE" | \
sed "s/MANAGER('\(.[^']*\)')/MANAGER('PLANET.\1.STAR')/"
DEF QR('xxx.yyy.sss') USE(YES) DESC('Something') MANAGER('PLANET.SUN.STAR') NAME('CAT') TRASMIT('TRUCK') REPLACE
var=$(echo "your_string" | grep -o "MANAGER('.[^']*')")
var="${var#*\'}"
var="${var%\'*}"
echo "var: $var"
var: SUN