Shell Script: Deseja excluir duas linhas consecutivas que correspondem ao padrão da linha específica

0

Desejo excluir duas linhas consecutivas de correspondência de padrões de uma linha específica de um arquivo.

Por exemplo conteúdo do arquivo é como abaixo.

Line1: a
Line2: b
Line3: c
Line4: Name: 123
Line5:  xyz
Line6: Name: 456
Line7:  abc

Eu quero encontrar as linhas a partir da linha 4, combinando o padrão de 1ª linha começando com "Nome:" e combinando o padrão de 2ª linha começando com o espaço em branco e excluindo as duas linhas consecutivas.

Qualquer maneira eficiente de fazer isso no shell usando sed ou outra coisa?

Para ser um pouco mais claro, desejo remover as informações de assinatura / soma de verificação do MANIFEST.MF.

Exemplo de MANIFEST.MF como abaixo: No arquivo de manifesto abaixo, desejo remover a entrada "Nome:". onde "Nome:" entrada pode estar em uma linha ou 2 (ou mais) linhas.

Inicialmente, minha solução era encontrar a primeira entrada "Nome:" seguida da entrada "SHA-256-Digest:" e excluir até o final do arquivo. Infelizmente, esta solução tem o problema de remover uma entrada necessária no meio. Por exemplo, "NetBeans-Simply-Convertible:" também está sendo removido.

Agora, quero remover a entrada "Nome:", se disponível em 1 linha ou a entrada em duas ou mais linhas. Mas eu não devo perder entradas como "NetBeans-Simply-Convertible:" ao remover entradas "Name:".

Já estou removendo as entradas "SHA-256-Digest:" com o comando abaixo no arquivo com sed -i "/^\SHA-256-Digest: /d" $manifest_file

Versão do Manifesto: 1.0
versão-info: ....

Nome: com / abc / xyz / pqr / cliente / relacionamento / mensagem / notificador / Relati
onshipUpdateNotifierFactory.class
SHA-256-Digest: cSSy6Y2L2F9N6FPtswUkxjF2kelMkGe4bFprcQ + 3uY =

Nome: com / abc / xyz / pqr / cliente / relacionamento / ui / BaseRelationshipView
$ 5.class
SHA-256-Digest: w9HgRjDuP024U4CyxeKPYFe6rzuzxZF3b + 9LVG36XP8 =

Nome: com / abc / xyz / pqr / client / impl / MofRelationshipAgentImpl.class
SHA-256-Digest: GwIBIU + UdPtjyRhayAVM90Eo + SwCT / kP65dI59adEnM =

Nome: com / abc / xyz / pqr / cliente / configurações / ConvertibleProperties.class
NetBeans-Simply-Convertible: {com / abc / xyz / pqr / cliente / configurações}
vertibleProperties
SHA-256-Digest: 5FszAtfpPXcLx / 6FBWbfeg6E4fwFMRozV + Q + 3rReATc = ...

Saída esperada:

Versão do Manifesto: 1.0
versão-info: ....


NetBeans-simplesmente-conversível: {com / abc / xyz / pqr / client / settings}
vertibleProperties

...

    
por onlysrinivas 15.04.2017 / 08:15

3 respostas

0

sed -e '
   4,$!d;      # skip non-relevant portion
   /Name:/N;   # grab the line coming after Name:
   /\n.* /d;   # what we were after is not this
   P;D
' yourfile
    
por 15.04.2017 / 09:37
0

awk abordagem:

Digamos que temos o seguinte arquivo de entrada file.txt (considerando que cada linha contém Line<number>: como primeiro campo):

Line1: a
Line2: b
Line3: c
Line4: Name: 123
Line5:  xyz
Line6: Name: 456
Line7:  abc
Line8: Name: 111
Line9: www
Line10: Num: 222
Line11:  abc
Line12: Name: 333
Line13:  ccc
awk '{ if ($2 == "Name:") { 
           if ((getline l) > 0){ 
               if (l ~ /^\S+  \S+/) { next } else { print $0 RS l }               
           }
       } else { print } 
}' file.txt

A saída:

Line1: a
Line2: b
Line3: c
Line8: Name: 111
Line9: www
Line10: Num: 222
Line11:  abc

"getline var" - lê o próximo registro da entrada do awk na variável var

The getline command returns 1 if it finds a record and 0 if it encounters the end of the file.

    
por 15.04.2017 / 15:50
0

Você vê que o que está perguntando não está claro: uma resposta exclui 4 linhas (as duas correspondentes e as duas subsequentes); outro exclui tudo mas as linhas correspondentes ...

Eu adicionarei o que você quiser: eu excluo duas linhas, a que corresponde Name: 123 e a subsequente. Eu faço isso com sed :

sed -e '/Name: 123/{N;d}' filename
    
por 15.04.2017 / 16:32