Eu usaria o seguinte:
sed -r '/(SEM|AFF|CON)/ s/([:,] *)[Tt]he *//g' file
Adicione a opção -i
para alterar o arquivo.
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.
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.
Tente desta maneira:
egrep -rl "^(SEM|CON|AFF)\: (t|T)he" * | xargs sed -r -i 's/(^(SEM|CON|AFF):\s)((t|T)he[ ]*)//g'