Comando para buscar a palavra completa entre aspas

0

Temos um valor

XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"

Precisamos buscar o valor XX WBP 8-501 Misc Receipts .

Nós tentamos como abaixo, mas está retornando apenas XX.

echo XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]" | cut -d" " -f9 | sed 's/"//g'
    
por Bommi 02.11.2017 / 13:22

3 respostas

2

Seguindo seu padrão, você só precisa adicionar algumas colunas a cut :

cut -d' ' -f9-13 | sed 's/"//g'

Você também pode usar uma solução sed pura:

sed 's/.*"\(.*\)" ".*"$//'

O padrão depende de duas cadeias de caracteres com aspas duplas no final. Com isso, exibe o primeiro dos dois (ou IOW, o segundo a última sub-string entre aspas duplas da string completa).

Atualização: Com echo como OP parece querer ...

echo 'XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"' | sed 's/.*"\(.*\)" ".*"$//'
    
por 02.11.2017 / 13:26
1

Por favor, note que a maneira que você echo a string, o shell vai comer aspas duplas, então você não é capaz de dizer até onde vai o seu nono campo. Você precisa cercar sua string com aspas simples primeiro.

Então você tem que considerar que cut está apenas procurando espaços como delimitadores e não sabe como ignorar espaços dentro de aspas, então faça desta forma:

echo 'XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"' | cut -d" " -f9- | cut -d\" -f 2

O primeiro cut mantém tudo do nono campo em diante, o segundo usa " como delimitador para manter apenas a parte dentro do primeiro par de citações.

Com sed puro, o mesmo pode ser feito com

sed -E 's/([^ ]* ){8}//;s/"//;s/".*//'

Em qualquer caso, você pode quebrar o script se adicionar espaços a campos de colunas anteriores.

    
por 02.11.2017 / 13:57
1

Você não obterá uma solução robusta usando cut ao extrair substrings lógicas desse tipo de entrada.

Use uma das seguintes soluções sólidas:

1) Comando Python (simplificado):

python -c 'import csv,sys; r=csv.reader(sys.stdin, delimiter=" "); print(next(r)[8])' <file
csv / a> módulo id muito bom para ler e escrever dados tabulares.

2) Comando GNU awk :

awk -v FPAT='"[^"]+"|[^"]+' '{ gsub("\"","",$8); print $8 }' file

A saída para ambas abordagens:

XX WBP 8-501 Misc Receipts
por 02.11.2017 / 13:41

Tags