sed com = como delimitador

6

Estou com dificuldades para descobrir como usar sed para cortar texto antes de um determinado delimitador.

Estou recebendo a saída de echo que retorna algo semelhante a:

valueA=TEXT

Eu gostaria de ter sed cortado o texto antes de = e deixando apenas TEXT.

Alguma dica de como isso pode ser feito?

    
por t988GF 10.12.2016 / 18:16

3 respostas

8

Você também pode usar cut :

cut -d= -f2- <<< "$yourvar"

ou

some_command | cut -d= -f2-
  • -d= define o delimitador como =
  • -f2- recebe o segundo campo e todos os seguintes
por 10.12.2016 / 20:53
5

Do comentário de @ Archemar, que provavelmente deveria ter sido uma resposta:

sed -e s/^[^=]*=//

A partir do comentário do @Baard Kopperud, o comando sed pode ser explicado como:

Substitua as linhas (s /) iniciando (^) por qualquer número de caracteres (*), exceto "=" ([^ =]) seguido por um sinal de equação (=) sem nada (//). Isso removerá qualquer coisa desde o início da linha até e incluindo o canto igual - deixando apenas o que vem depois do "=". Você precisa do "[^ =] *" no caso de existirem múltiplos sinais de igual ... você só deseja excluir até o primeiro. Se você acabou de usar ". *", Você cortaria até e incluiria o último sinal de igual, já que as expressões regulares "desejam" ser o maior tempo possível e começar o máximo possível à esquerda.

    
por 10.12.2016 / 19:29
2

I'm receiving output from echo

Se você estiver formando echo a partir de uma variável, poderá usar os recursos de manipulação de strings integrados do shell:

# Instead of value=$(echo "$var" | cut -d= -f2-)
value=${var#*=}

O *= é apenas um padrão no estilo glob, em que * corresponde a qualquer coisa. O # indica que o padrão corresponde a um prefixo a ser removido da variável.

Isso será mais rápido e mais confiável do que o piping de echo , pois evita o problema com o qual xpg_echo pode entrar (bem como outras peculiaridades de análise de echo ), e evita uma bifurcação. / p>

Você também pode obter a chave usando este método:

key=${var%%=*}

Observe que %% é usado em vez de % para corresponder com avidez. Com isso, ele não será ativado por nenhum sinal = em potencial no valor.

A sintaxe está documentada em man bash , em Parameter Expansion :

   ${parameter#word}
   ${parameter##word}
          Remove matching prefix pattern.  The word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          the  beginning of the value of parameter, then the result of the
          expansion is the expanded value of parameter with  the  shortest
          matching  pattern  (the ''#'' case) or the longest matching pat‐
          tern (the ''##'' case) deleted.  If parameter is  @  or  *,  the
          pattern  removal operation is applied to each positional parame‐
          ter in turn, and the expansion is the resultant list.  If param‐
          eter  is  an array variable subscripted with @ or *, the pattern
          removal operation is applied to each  member  of  the  array  in
          turn, and the expansion is the resultant list.

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.  The word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          a  trailing portion of the expanded value of parameter, then the
          result of the expansion is the expanded value of parameter  with
          the  shortest  matching  pattern (the ''%'' case) or the longest
          matching pattern (the ''%%'' case) deleted.  If parameter  is  @
          or  *,  the  pattern  removal operation is applied to each posi‐
          tional parameter in turn, and the  expansion  is  the  resultant
          list.   If  parameter is an array variable subscripted with @ or
          *, the pattern removal operation is applied to  each  member  of
          the array in turn, and the expansion is the resultant list.
    
por 11.12.2016 / 07:13