Sed / RegEx - entendendo uma declaração

0

Atualmente, estou tentando fazer engenharia reversa de um lote de scripts transmitidos do nosso último SysAdmin.

Há uma linha em um dos scripts de shell que eu (pela minha vida) não consigo entender. Aqui está: -

sed -n 'H;${x;s/^\n//;s/-jar\n/Dcom.sun.management.jmxremote.ssl=false\n&/;p;}' "$File"

GNU Bash 4.2.46 (2) RHEL6 64 bits.

    
por 64Hz 09.04.2018 / 10:58

1 resposta

0

O comando requer o GNU sed e parece inserir a string Dcom.sun.management.jmxremote.ssl=false seguida por uma nova linha antes da primeira ocorrência de -jar no final de uma linha.

Exemplo:

something
something
something-jar
something

é transformado em

something
something
somethingDcom.sun.management.jmxremote.ssl=false
-jar
something

O comando sed lê todo o arquivo na memória executando H para cada linha do arquivo (acrescenta a linha atual ao "espaço de espera" com um caractere de nova linha no início). Quando ele atinge a última linha ( $ ), ele troca o espaço de espera pelo espaço de padrão ( x ) e exclui a primeira nova linha (ponha lá executando H para a primeira linha do arquivo). Em seguida, ele substitui -jar\n por Dcom.sun.management.jmxremote.ssl=false\n-jar\n (o & é o que foi correspondido pela expressão). Em seguida, imprime as linhas coletadas ( p ).

Outra maneira de fazer a mesma coisa com awk :

awk 'skip==0 && sub("-jar$", "Dcom.sun.management.jmxremote.ssl=false\n-jar") { skip=1 } { print }' "$File"

Isso tenta fazer a mesma substituição em cada linha e, quando tiver êxito, define skip=1 , o que fará com que ela não tente novamente. Cada linha é impressa, independentemente de uma substituição ter ocorrido ou não.

Isso não armazena o arquivo inteiro na memória.

    
por 09.04.2018 / 11:19