Como esse comando sed está funcionando?

4

Eu quero entender como o comando sed está funcionando:

sed -nre "/jar$/ { x; d; }; /class$/ { x; p; }

Na verdade, é parte de outro comando para encontrar um determinado arquivo de classe na lista de arquivos jar:

find . -name "*jar" -print -exec jar -tf '{}' \; | grep -E "jar$|CLASS_NAME" | sed -nre "/jar$/ { x; d; }; /class$/ { x; p; } "
    
por SnoopyMe 17.09.2012 / 11:03

1 resposta

9

Primeiro, vamos começar das opções de linha de comando:

  • -n desativa a saída normal do buffer. Apenas linhas solicitadas para impressão (por exemplo, com o comando p ) serão impressas

  • -r ativa o regexp estendido

  • -e não é realmente necessário quando estamos especificando comandos sed na linha de comando e não do arquivo

Agora vem os comandos sed. Existem dois, separados por ; character. Sed vai linha por linha e executa esses dois comandos em ordem. Mas só se eles combinarem. Aqui, ambos os comandos são prefixados com /SOMETHING/ , o que significa que este comando só é executado se a linha atual corresponder a SOMETHING regexp.

/jar$/ regexp corresponde apenas se a linha atual terminar com jar . % Regexp /class$/ semelhante coincide apenas se a linha atual terminar com class . Agora, se determinada linha corresponder, ela executa dois comandos (eles são agrupados com {} ) - no primeiro caso, é x e, em seguida, d . No segundo caso, é o comando x e, em seguida, p .

  • O comando x é eXchange . sed tem um buffer que você pode usar para armazenar algumas linhas. Este comando troca este buffer com a linha atual (então a linha atual vai para esse buffer e o conteúdo do buffer se torna a linha atual).

  • O comando
  • d descarta a linha atual, lê a nova e começa a executar os comandos sed da primeira linha (todos os comandos após d são ignorados para a linha atual).

  • O comando
  • p imprime a linha atual. Como usamos os argumentos do comando -n apenas as linhas impressas com p serão mostradas na saída.

Então, para resumir:

  • /jar$/ { x; d; } significa - se a linha atual terminar com jar , salve-a no buffer

  • /class$/ { x; p; } significa - se a linha atual terminar com class , obtenha o conteúdo do buffer (que deve conter a última linha terminando com jar , a menos que haja um arquivo terminando com class ) e imprima

por 17.09.2012 / 11:27