Input.txt:
8B0C
remove
8B0D
remove
8B0E
remove
8B0F
8B10
remove
8B14
remove
8B15
remove
8B16
remove
8B17
remove
8AC0
8AC1
remove
8AC2
remove
8AC3
remove
8AE4
8AE5
8AE6
remove
Saída desejada:
8B0F
8AC0
8AE4
8AE5
Quero imprimir uma linha se essa linha ou a próxima linha não contiver 'remover'. Estou usando o solaris 5.10, KSH.
text-processing
sed
awk
solaris
Ayrton Senna
fonte
fonte
Respostas:
Com
sed
:Isso puxa a
N
linha ext para o espaço do padrão (se não estiver!
na$
linha t) e verifica se o espaço do padrão corresponderemove
. Se não existir (significa que nenhuma das duas linhas no espaço do padrão contém a sequênciaremove
), elaP
cria o primeiro\n
caractere de linha de linha (ou seja, imprime a primeira linha). Em seguida,D
elimina o primeiro\n
caractere de linha de linha e reinicia o ciclo. Dessa forma, nunca há mais de duas linhas no espaço do padrão.É provavelmente mais fácil de entender o
N
,P
,D
ciclo se você adicionarl
antes e após aN
olhar para o espaço padrão:portanto, usando apenas as últimas seis linhas do seu exemplo:
o último comando gera:
Aqui está uma breve explicação:
fonte
fonte
O método acima não lê Registros linha por linha , mas lê Registros com várias linhas de um Separador de Registros (RS) para o próximo (ou final de arquivo) -
RS
sendo a própria linha "remover" (incluindo sua à direita `\ n).O
!RT
teste é necessário para quando a última linha não for umaRS
linha.RT
, um gawk-ism , é o texto real dos registros atuaisRS
.gensub
também é um gawk-ism .Se você precisar verificar se há uma linha de marcador que corresponda a "remover" em qualquer lugar da linha, versus uma linha que seja igual a "remover", basta alterar o Separador de registros para:
Resultado:
fonte