Corresponde a primeira palavra seguinte que corresponde a um determinado padrão usando sed

2

Estou com problemas para obter o seguinte comportamento:

input='somestring... --key1 val1 --key2 val2 --key3 val3 somestring...'
output='val1'

Eu tentei usar:

echo $input | sed -nE 's/.*--key1 (.*) (--.*)$//p' 
#but this gives 'val1 --key2 val2' instead of 'val1' 

Basicamente, meu problema é que não sei como dizer sed para corresponder ao padrão na ordem inversa (para que --key2 não seja capturado em ). Eu acredito que há uma maneira simples aqui, mas não consigo encontrá-lo?

edit: uma correção poderia ser usar:

echo $input | sed -nE 's/.*--key1 ([^(--)]*) (--.*)$//p' 

Mas gostaria de saber se existe uma solução "melhor" para esse caso de uso?

    
por bagage 07.07.2015 / 11:11

1 resposta

1

Isso porque (.*) é muito ganancioso.

perl tem correspondência não-gananciosa:

perl -nE 'if (/--key1 (.*?) --/) {say $1}' <<< "$input"

Se você realmente quiser usar a análise de opções adequada:

eval set -- "$(getopt --long key1:,key2:,key3: -- $input)"   # $input is unquoted!

while :; do
    case "$1" in
        --key1) key1=$2; shift 2;;
        --key2) key2=$2; shift 2;;
        --key3) key3=$2; shift 2;;
        --) shift; break;;
    esac
done

[[ "$output" = "$key1" ]] && echo OK
    
por 07.07.2015 / 12:38

Tags