Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在匹配文本后提取大括号内的字符串,并作为变量存储在中_Bash_Shell_Unix_Awk - Fatal编程技术网

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