encontrar palavras que contenham apenas 3 caracteres usando sed em um arquivo

0

Eu preciso imprimir apenas palavras que consistem em 3 caracteres, no entanto, o documento do word é uma lista numerada.

Aqui está a pergunta exata que tenho que responder:

Using the sed command with [[:lower:]] character class on the animals file, find all the animal names that are only three characters long (3 marks).

Isso é o que eu tentei:

cat animals | sed '/{[:lower:]].../d'  
cat animals | sed '/{[:lower:]]/d' 
sed '/[[:lower:]]{3}/d' animals

Este é o arquivo em que estou tentando encontrar as palavras (o arquivo animals ):

01. aardvark
02. badger
03. cow
04. dog
05. elephant
06. fox
07. goose
08. horse
09. iguana
10. jackal
11. koala
12. lamb
13. mongoose
14. narwhal
15. onyx
16. pig
17. quail
18. rat
19. snake
20. tiger
21. umbrellabird
22. vulture
23. walrus
24. xerus
25. yak
26. zebra

Acabei de descobrir que o código não pode ter o [[: lower:]] nele mais de uma vez existe uma maneira de fazer isso ??

    
por The Real Fawcett 20.10.2018 / 21:57

4 respostas

1

sed é um editor de fluxo, o que significa que lê texto, edita e produz o resultado. Não precisa necessariamente trabalhar em arquivos, apenas fluxos de texto. (No seu caso, o fluxo de texto vem de um arquivo, então não há diferença prática.)

Usando sed , você tem algumas opções

  1. Exclua todas as linhas que não possuem exatamente três letras minúsculas consecutivas, deixando o restante a ser passado (e impresso).
  2. Imprima apenas linhas que contenham exatamente três letras minúsculas consecutivas.

Em ambos os casos, você precisará garantir que os três sejam precedidos por um espaço e não tenham nada depois deles.

Isso corresponderá palavras de quatro (ou mais) caracteres e excluirá a linha correspondente. Note que não ligamos as extremidades da sequência para que elas fiquem bem no meio de uma sequência mais longa

sed '/[[:lower:]][[:lower:]][[:lower:]][[:lower:]]/d' animals

Isso funcionará no arquivo como determinado, mas não leva em consideração a possibilidade de haver animais de duas (ou mesmo apenas uma) letra. (Pense "boi", por exemplo). Então, precisamos derrubá-los. Neste ponto, precisamos informar sed que há várias operações a serem aplicadas a cada linha, por sua vez. Também precisamos introduzir um novo caractere $ , que afirma que a expressão regular deve se ligar ao fim de linha:

  • Se encontrarmos quatro caracteres em uma linha, exclua a linha
  • Se encontrarmos um espaço, duas letras e, em seguida, fim de linha, exclua a linha
  • Se encontrarmos um espaço, uma letra e, em seguida, fim de linha, exclua a linha

Isso pode ser escrito em formato longo como este:

sed -e '/[[:lower:]][[:lower:]][[:lower:]][[:lower:]]/d' -e '/ [[:lower:]][[:lower:]]$/d' -e '/ [[:lower:]]$/d' animals

Se você tiver uma versão adequada de sed , poderá reduzir isso para um formato mais legível. (Procure a bandeira -r .)

    
por 22.10.2018 / 10:34
0

Estou usando sed (GNU sed) 4.2.2 e obtive o resultado que você queria com isso:

sed 's/^[[:digit:]]\{2\}[[:punct:]][[:space:]]\([[:lower:]]\{3\}\)//gm' animals.txt | sed '/[[:lower:]]\{4\}/d'

Ele segue estas etapas:

  1. Encontre as linhas que começam com 2 dígitos, seguidas por uma pontuação ("."), um espaço e, em seguida, uma palavra com pelo menos 3 caracteres minúsculos;
  2. Dentro dessa linha, selecione o grupo de caracteres minúsculos correspondidos;
  3. Com o resultado da etapa anterior, exclua as palavras com 4 ou mais caracteres minúsculos.

A saída tem apenas as palavras com exatamente três caracteres minúsculos:

cow
dog
fox
pig
rat
yak

Para referência, o sed do GNU usa esta sintaxe de expressão regular .

    
por 23.10.2018 / 00:09
0

A maneira mais direta de fazer isso seria algo assim:

$ sed -n '/^....[a-z]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

Para atender ao requisito de usar [[:lower:]] , você pode modificar o acima da seguinte forma:

$ sed -n '/^....[[:lower:]]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

Você também pode trocar o .... por uma sequência de tamanho explicitamente:

$ sed -n '/^.\{4\}[[:lower:]]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

Referências

por 23.10.2018 / 05:08
0

Você estava perto. A ideia básica de combinar 3 elementos está na direção certa.

Há um erro de sintaxe para o BRE em que o {} precisa de barra invertida (ou use -E ).

No entanto, seu regex: [[:lower:]]\{3\} corresponderá a qualquer coisa com três ou mais caracteres.

Você precisa ancorar o regex, talvez do space ( ) ao end ( $ ):

$ <infile sed -n '/ [[:lower:]]\{3\}$/p'

Observe que o comando não será impresso por padrão e somente em linhas correspondentes será p rint. Isso poderia ser escrito ao contrário:

$ <infile sed '/ [[:lower:]]\{3\}$/!d'

Ou seja: imprimir por padrão, nas linhas não correspondentes, excluí-las ( d ).

Ou você pode usar limites de palavras:

$ <infile sed '/\b[[:lower:]]\{3\}\b/!d'

Ou:

$ <infile sed '/\<[[:lower:]]\{3\}\>/!d'

E, talvez, use o ERE regex:

$ <infile sed -E '/\b[[:lower:]]{3}\b/!d'

Se você precisar apenas dos nomes dos animais, use isto:

$ <infile sed -E '/.*\<([[:lower:]]{3})\>/!d;s///'
cow
dog
fox
pig
rat
yak
    
por 24.10.2018 / 04:27

Tags