Como posso excluir todas as palavras em um arquivo começando com uma string específica (neste caso, a string "end") para que:
<region> sample=PDL UP IN-A-1.flac lokey=21 hikey=21 lovel=0 hivel=21 end=423471 pitch_keycenter=21
<region> sample=PDL UP IN-A-1_0001.flac lokey=21 hikey=21 lovel=22 hivel=42 end=370196 pitch_keycenter=21
<region> sample=PDL UP IN-A-1_0002.flac lokey=21 hikey=21 lovel=43 hivel=63 end=362268 pitch_keycenter=21
Torna-se:
<region> sample=PDL UP IN-A-1.flac lokey=21 hikey=21 lovel=0 hivel=21 pitch_keycenter=21
<region> sample=PDL UP IN-A-1_0001.flac lokey=21 hikey=21 lovel=22 hivel=42 pitch_keycenter=21
<region> sample=PDL UP IN-A-1_0002.flac lokey=21 hikey=21 lovel=43 hivel=63 pitch_keycenter=21
usando a linha de comando
Tentei:
sed 's/\S*\(end\|END\)\S*//g' file.txt
Mas não funcionou.
Obrigado.
Você estava bem perto. A maior coisa que você estava perdendo era ativar o regex estendido.
Em segundo lugar, você tem "\S*" no início da partida. Na verdade, isso não faz nada, pois permite correspondências "um ou zero" em qualquer coisa, exceto um espaço. Como "end" sempre começa em um espaço, isso nunca será usado. Acredito que você quis dizer que "end" é o início da palavra, que é um caractere "<".
Aqui está uma versão de trabalho:
sed -E 's/\<(end|END)\S*//g' file.txt
Mas pode melhorar um pouco. Aqui, tornei a correspondência de maiúsculas e minúsculas insensível para remover o "ou" da palavra e, assim, remover a necessidade de regex estendido. Eu também adicionei um "\s" à direita para remover o espaço à direita (evita um espaço duplo na lacuna).
sed 's/\<END\S*\s//gi' file.txt
Aqui está um guia sobre sed do GNU para referência.
Atualizar
Com base no seu comentário abaixo, parece que todos nós não entendemos o que você queria. Parece que você queria não apenas remover esses campos de texto, mas também fazer isso no próprio arquivo. Embora eu peça desculpas por ter perdido esse ponto, esta é uma boa lição sobre por que é tão importante formular sua pergunta para perguntar exatamente o que você deseja.
De qualquer forma, sua solução (para adicionar > arquivo.txt) substitui efetivamente o arquivo antigo pelo novo texto. Especificamente, o sed enviará o resultado para stdout (seu terminal). O símbolo ">" é chamado de redirecionamento. Ele redirecionará o stdout antes dele para o que estiver depois dele. Isso realmente removerá o arquivo existente e o substituirá por um novo.
Enquanto isso funciona, não é o melhor. Se você deseja substituir a string no arquivo no local, o sed também pode fazer isso por você adicionando uma opção "-i":
sed -i 's/\<END\S*\s//gi' file.txt
Aqui está uma referência útil para ajudar a formular perguntas de forma eficaz. Quanto mais preciso você for ao transmitir o que deseja, melhores serão as respostas!
Espero que isto ajude!
neste caso, como a entrada é tão bem formada, pode ser mais fácil usar
cut
explicação
-d" "
define o separador de campo como espaço. o padrão é guia.-f-8,10-
pegue os campos primeiro até o oito, depois o décimo até o último. pulando o nono campo que é aquele que começa com "end".Corresponde e remove um espaço, seguido de end ou END, seguido de tantos não espaços quanto possível.
Isso foi estranho!
Eu tentei todas as sugestões diferentes, e nada funcionou. O arquivo apenas permaneceu inalterado.
Em seguida, adicionei > file1.txt ao comando, para que a saída criasse uma cópia nova e editada do original e, em seguida, praticamente todos os códigos sugeridos funcionaram.
Não tenho ideia do porquê disso.
De qualquer forma, obrigado a todos por suas respostas rápidas e eficazes.