Substitua uma string e substitua-a por uma parte dela

2

Estou limpando meus dados armazenados em arquivos de texto. Cada linha começa com um rótulo de categoria seguido pelos dados reais que eu quero limpar. Existem muitos arquivos de texto em diferentes subpastas, então eu uso egrep para passar os nomes dos arquivos para sed .

CON: the Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: The holy seat
TTITLE: As we go, the Kuckuck comes too

Agora, em todas as linhas que começam com (SEM|AFF|CON) , quero substituir (T|t)he[ ]* quando ele segue (:|\,) . Ou seja, os dados devem se parecer mais tarde com

CON: Unix and Linux question
SEM: eins, zwei, drei
AUTH: , the
AFF: holy seat
TTITLE: As we go, the Kuckuck comes too

Até agora, tentei alcançar isso em duas etapas: uma para a parte : e outra para a parte , . Mas eu já luto com o primeiro passo.

Primeira parte O comando / padrão para identificar os arquivos é egrep -rl ^"(SEM|CON|AFF)\: (t|T)he" . Isso funciona como pretendido.

Agora, quando faço

egrep -rl ^"(SEM|CON|AFF)\: (t|T)he" | xargs sed -i 's/\((SEM|CON|AFF)\: \)(t|T)he[ ]*//g'

nada acontece. Minha sed está errada? Não posso voltar a falar com ((SEM|CON|AFF)\: com ?

Segunda parte O comando / padrão para identificar os arquivos é egrep -rl ^"(SEM|CON|AFF)\:.*\,[ ]*(t|T)he" . Isso também funciona como pretendido. Mas toda combinação em sed que eu tentei até agora exclui o conteúdo.

    
por MERose 10.12.2014 / 12:33

3 respostas

2

Eu usaria o seguinte:

sed -r '/(SEM|AFF|CON)/ s/([:,] *)[Tt]he *//g' file

Adicione a opção -i para alterar o arquivo.

    
por 10.12.2014 / 12:50
2

Use apenas uma expressão sed (precisa do GNU sed):

sed -r -i -e '/(SEM|AFF|CON)/s/([:,]\s*)the\s+//ig' *

O padrão de pesquisa no início do comando sed restringe a substituição às linhas que começam com as categorias selecionadas. O sinalizador i para o comando de substituição ( s// ) torna o padrão insensível a maiúsculas e minúsculas, o sinalizador g permite mais que a substituição em uma linha. \s significa qualquer espaço em branco (espaço, tabulações).

O sed usa expressões regulares estendidas com o -r flag, isso é suportado, por exemplo, pelo GNU sed. O sinalizador -i ativa a edição inplace. O shell expande * para todos os arquivos no diretório atual.

O padrão garante pelo menos um espaço ou uma tabulação depois de the , de modo que as palavras que começam com the , como theater , não sejam substituídas.

    
por 10.12.2014 / 12:41
1

Tente desta maneira:

egrep -rl "^(SEM|CON|AFF)\: (t|T)he" * | xargs sed -r -i 's/(^(SEM|CON|AFF):\s)((t|T)he[ ]*)//g'
    
por 10.12.2014 / 12:44