Como sed -e '/./{H;$!d;}' -e 'x; / AAA /! d;' trabalha para imprimir parágrafo [duplicado]

0

Alguém pode explicar como funciona o comando abaixo sed para imprimir um parágrafo?

Comando:

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' file

Se possível, alguém pode explicar quebrando este comando em pedaços para que eu possa compreender como modificar o comando de acordo com condições diferentes.

    
por Utkarsh Mishra 10.05.2018 / 12:37

1 resposta

1

O comando

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' file

imprime parágrafos que contêm a string AAA .

Isso chama sed com o seguinte script sed :

/./{
    H
    $!d
}
x
/AAA/!d

Versão anotada:

/./{        # When hitting a line that contains at least one character...
    H;      # Append the line to the "hold space".
    $!d;    # If it's not the last line, delete it.
}
x;          # Swap the hold space and the pattern space.
/AAA/!d;    # Delete the pattern space if it does not contain the string "AAA"
            # (implicit print)

Portanto, em suma, ele coleta linha após linha no "espaço reservado" (um buffer de uso geral em sed ) e, quando encontra uma linha vazia (o padrão /./ não corresponde), ele determina se a coleção de linhas armazenadas contiver a string AAA e imprimi-la, se houver.

Isso também é descrito em uma resposta aqui: GREP / SED ou AWK: imprime um parágrafo inteiro em um arquivo na correspondência de padrões

Dado o arquivo

this is
a paragraph

this is
another one

this paragraph
contains the string
AAA

Ele produziria o último parágrafo (com uma linha vazia principal).

Para se livrar da linha vazia que estará precedendo cada parágrafo (se é isso que você quer), use

/./{
    H
    $!d
}
x
/AAA/!d
s/\n//

Ou, na linha de comando

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;s/\n//'
    
por 10.05.2018 / 12:47