Exemplo:
This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.
Deve se tornar:
This is
that wants
anyway.
Eu encontrei alguns tópicos semelhantes no fórum, mas eles não parecem funcionar com colchetes de várias linhas.
Se possível, eu preferiria algum método de uma linha, como soluções baseadas em grep, sed, awk ... etc.
EDIT: As soluções parecem estar OK, mas notei que meus arquivos originais incluem aninhamento de colchetes. Então, eu estou abrindo uma nova pergunta. Obrigado a todos: como posso excluir todo o texto entre colchetes aninhados em um arquivo de texto com várias linhas?
text-processing
sed
awk
grep
Sopalajo de Arrierez
fonte
fonte
sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Respostas:
Explicação:
:again;$!N;$!b again;
Isso lê o arquivo inteiro no espaço do padrão.
:again
é um rótulo.N
lê na próxima linha.$!b again
volta aoagain
rótulo com a condição de que essa não seja a última linha.s/{[^}]*}//g
Isso remove todas as expressões entre chaves.
No Mac OSX, tente:
Chaves aninhadas
Vamos considerar isso como um arquivo de teste com muitas chaves aninhadas:
Aqui está uma modificação para manipular chaves aninhadas:
Explicação:
:again;$!N;$!b again
É o mesmo de antes: ele lê o arquivo inteiro.
:b
Isso define um rótulo
b
.s/{[^{}]*}//g
Isso remove o texto entre chaves, desde que o texto não contenha chaves internas.
t b
Se o comando substituto acima resultou em uma alteração, volte para o rótulo
b
. Dessa maneira, o comando substituto é repetido até que todos os grupos de chaves sejam removidos.fonte
EDIT
) não seja exatamente a mesma, acho que você deveria responder também. Seria bom com as regras do fórum?Perl:
Se você deseja editar no local
Isso lê o arquivo como uma única sequência e faz uma pesquisa e substituição global.
Isso manipulará o suporte aninhado:
fonte
Sed:
iniciado desde a linha com
{
e obter a próxima linha (N
) até que a substituição ({}
) possa ser feita (T
significa retornar à marca feita por:
se a substituição não for feita)Um pouco modificado para ser verdadeiro se muitos enrolamentos entre uma linha
Remova todos os símbolos entre parênteses (
[^}]
igual a todos os símbolos, excetoright bracket
para quesed
não sejam gananciosos) e, se a linha permanecerleft bracked
- volte para começar com a próxima linha adicionada, se não houverright bracket
.fonte