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
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 =
...
Versão do Manifesto: 1.0
versão-info:
....
NetBeans-simplesmente-conversível: {com / abc / xyz / pqr / client / settings}
vertibleProperties
...
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
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.
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