como obter valor de var no arquivo com sed [closed]

1

eu gostaria de fazer isso: O arquivo contém:

VAR_1|VALU_1
VAR_2|VALU_2
VAR_3|VALU_31
VALU_31
VALU_33
VAR_4|VALU_4
VAR_5|VALU_5
VAR_6|VALU_61
VALU_62
VAR_7|VALU_7
.....

Como posso obter o valor de uma string com sed ou outro?

Eu tento:

sed -n '/^VAR_3|*/,/^[A-Z_]+/{;p}'

Obrigado pela sua ajuda.

    
por kgoul 02.12.2015 / 16:00

2 respostas

2

Imaginando que sua entrada é salva em um arquivo chamado "test.txt", você pode usar "awk" com a seguinte sintaxe:

awk -F '|' '/^VAR_3/ {print $2}' test.txt

Exemplo de execução para a entrada que você forneceu:

$ awk -F '|' '/^VAR_3/ {print $2}' test.txt
VALU_31

Aqui está uma explicação básica deste comando awk:

-F '|' : define "|" (símbolo de pipe) como o separador de campo% /^VAR_3/ : corresponde apenas às linhas que começam com "VAR_3"
{print $2} : imprime o segundo campo / coluna (que, nesse caso, contém o valor que você deseja para imprimir)

ATUALIZAÇÃO (3 de dezembro de 2015):

Assim, o OP adicionou um comentário esclarecedor, o que leva a concluir que ele quer que a pesquisa seja multilinha, considerando as linhas entre dois "tokens" como parte do valor do primeiro token.

Aqui está uma versão revisada para o exemplo inicial, desta vez usando os comandos " sed " (2 vezes!) e " head ":

$ sed -n  '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1
VALU_31
VALU_31
VALU_33

OK. Parece bom : -) Vamos ver se isso vale para um caso de linha única:

$ sed -n  '/VAR_4|/,/VAR_/p' test.txt | sed '1 s/VAR_4|//' | head -n -1
VALU_4

Bom. Por isso, também funciona para casos de linha única!

Funciona bem se a string pesquisada NÃO estiver na entrada? Vamos tentar por VAR_0 (que NÃO existe no exemplo dado):

$ sed -n  '/VAR_0|/,/VAR_/p' test.txt | sed '1 s/VAR_0|//' | head -n -1  
$ 

Ótimo. Então, isso parece estar funcionando em vários casos (embora eu ache que pode haver soluções mais eficientes).

Então, como isso funciona? Aqui está o resumo básico para o exemplo "VAR_3" ...

A primeira parte - sed -n '/VAR_3|/,/VAR_/p' test.txt - retorna a seguinte saída:

$ sed -n  '/VAR_3|/,/VAR_/p' test.txt
VAR_3|VALU_31
VALU_31
VALU_33
VAR_4|VALU_4

Então, essa parte basicamente combina tudo entre VAR_3 e a próxima ocorrência de VAR_ . Como podemos ver, esta parte parece estar retornando o que queremos ... Mais duas coisas que não queremos: o " VAR_3| " na primeira linha -E- a última linha.

Então, canalizamos essa primeira saída para outra instrução "sed" que só se aplica à primeira linha, e substituímos a string " VAR_3| " por nada, removendo-a efetivamente:

$ sed -n  '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//'
VALU_31
VALU_31
VALU_33
VAR_4|VALU_4

O " 1 " é para aplicar o comando sed à primeira linha ... E queremos NÃO incluir essa última linha, então canalizamos essa saída para o comando " head " com a opção " -n " ("MINUS n") - especificamente " -n 1 " para excluir a última linha:

$ sed -n  '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1
VALU_31
VALU_31
VALU_33
    
por 02.12.2015 / 18:27
0

Que ótimo. Eu gostaria de substituir "VAR_" em "sed -n '/ VAR_3 | /, / VAR _ / p' test.txt | sed '1 s / VAR_3 | //' | cabeça -n -1" por coisas assim: sed -n "/ $ SEEK | /, / ^ [A-Z _-] + \ | / p" get-server-infos.txt | sed "1 s / $ SEEK | //" | head -n -1

Meu nome VARS é sempre formatado assim "^ [A-Z _-] + | *"
Comece com letra maiúscula e pode conter "-" e "_" e sempre conter "|".

Thx muito pela sua ajuda.

    
por 04.12.2015 / 13:28

Tags