substitua todos os nomes por uma alternativa usando o editor Stream (Sed)

2

Eu tenho essa pergunta em uma tarefa. Nada funciona .. Alguém pode me ajudar?

Escreva um script sed que substitua todos os nomes por uma alternativa,

pesquise todas as palavras que:

  • Comece com um capital
  • Mais de duas letras,
  • Onde há um espaço em branco na frente dele e
  • O caractere antes do espaço em branco não é uma pontuação que termina uma frase.

Substitua essas palavras em "Derp" + os dois últimos caracteres da palavra.

    
por Jleeeeny 16.02.2012 / 22:18

2 respostas

1

Isso é bastante complicado de se fazer no sed, mas aqui está uma versão que pode funcionar desde que haja um caractere (eu escolhi % ) que nunca aparecerá na entrada. O caractere é usado para marcar.

Digamos que você tenha um arquivo de texto chamado words com o seguinte conteúdo:

Will He beat Sit Down Boy Oh Not now Latch Wi, Qq or Spat? GNU Hurd, protocols on GNU Mach. The Hurd versus Unix.

O seguinte script bash fará o trabalho:

cat words
sed 's/ [A-Z][A-Za-z]*[A-Za-z]\{2\}/%&/g' words|tee a
sed 's/\([.!?]\)%//g' a|tee b
sed 's/% [A-Za-z]*\([A-Za-z]\{2\}\)/ Derp/g' b|tee c

A saída dos itens acima será (eu separei cada um por nova linha):

Will He beat Sit Down Boy Oh Not now Latch Wi, Qq or Spat? GNU Hurd, protocols on GNU Mach. The Hurd versus Unix.

Will He beat% Sit% Down% Boy Oh% Not now% Latch Wi, Qq or% Spat?% GNU% Hurd, protocols on% GNU% Mach.% The% Hurd versus% Unix.

Will He beat% Sit% Down% Boy Oh% Not now% Latch Wi, Qq or% Spat? GNU% Hurd, protocols on% GNU% Mach. The% Hurd versus% Unix.

Will He beat Derpit Derpwn Derpoy Oh Derpot now Derpch Wi, Qq or Derpat? GNU Derprd, protocols on DerpNU Derpch. The Derprd versus Derpix.

Veja como funciona:

  • A primeira linha apenas imprime o arquivo, então você vê a posição inicial.
  • A segunda linha marca todas as palavras em maiúsculas que são precedidas por um espaço e são maiores que 2 caracteres com % . Assim, por exemplo, marque Latch como % Latch . Observe o espaço, eu chamarei esta palavra-espaço.
  • A terceira linha removerá a marca de todas as palavras de espaço precedidas por um caractere que termina uma frase (para simplificar, escolhi apenas . , ! ou ? - você pode adicionar outras, como ) ou tais, se necessário)
  • A terceira linha fará a transformação Derp real, ou seja, substituirá todas as palavras de espaço marcadas com % por DerpXX , XX sendo dois últimos caracteres dessa palavra-espaço

Observe que há detalhes técnicos que não foram abordados aqui, como:

  • Isso funcionará apenas para palavras em ASCII dos EUA (por exemplo, não funcionará para todas as palavras em francês, como Être )
  • Outros caracteres talvez precisem ser considerados (por exemplo, Oceans in "Oceans Eleven" considerou uma palavra, embora tenha " na frente?)
  • Não funcionará para espaços em branco que não sejam de espaço (por exemplo, guias)

e assim por diante.

Para torná-lo apenas um script sed , basta concatenar:

sed '
s/ [A-Z][A-Za-z]*[A-Za-z]\{2\}/%&/g
s/\([.!?]\)%//g
s/% [A-Za-z]*\([A-Za-z]\{2\}\)/ Derp/g
' words

Obviamente, no mundo real, eu não usaria sed para fazer tarefas como essa. Então, novamente, eu provavelmente não teria tarefas como esta, também ...:)

    
por 17.02.2012 / 05:05
0

Isso pode funcionar para você:

sed ':a;s/\([^.!?] \)[A-Z][A-Za-z]*\([A-Za-z]\{2\}\)\>/\nDerp/;ta;s/\n//g' file
    
por 19.02.2012 / 14:59