sed -ne's/[[:alpha:]]//3;t' -e's//&/2p' <in >out
... irá s///
ubstituir a terceira ocorrência em uma linha de qualquer caractere na classe [[:alpha:]]
. Posteriormente, t
ests se essa substituição foi bem-sucedida e, em caso afirmativo, ramifica-se fora do script.
Como sed
é instruído a -n
ot a imprimir automaticamente, as linhas de entrada com três ou mais caracteres alfabéticos são efetivamente excluídas da saída e as únicas linhas de entrada restantes para a segunda instrução s///
ubstitution são aquelas com dois ou menos caracteres alfabéticos.
A segunda substituição usa o vazio //
regex no lado esquerdo - que, para sed
, (mais eficientemente) refere-se ao mais recentemente compilado /
regexp
/
- e assim pode ser lido como s/[[:alpha:]]/...
mais uma vez. Este tenta s///
ubstitute a segunda ocorrência de um caractere alfabético em uma linha para &
em si - e, como tal, resulta em um noop efetivo e nenhuma modificação real na linha. No entanto, se conseguir fazer isso, a linha também será p
rinted para a saída.
Em resumo - o primeiro s///
ubstitution efetivamente exclui da saída todas as linhas de entrada que correspondem a três ou mais caracteres alfabéticos, e a segunda substituição p
rints do que resta para a saída apenas aqueles que correspondem a dois alfabéticos. >
... w / grep
...
grep -xE '([0-9]*[[:alpha:]]){2}' <in >out
Esta declaração não faz exatamente como pedida. Ele seleciona de entrada apenas as linhas que são compostas de apenas alfanuméricos, e desse subconjunto apenas aquelas que não correspondam a mais ou menos de dois alfabéticos, o segundo dos quais deve ser o último caractere. Essa declaração funcionará para produzir o exemplo de saída desejado da entrada de exemplo.
Para fazer como solicitado, porém:
grep -xE '([^[:alpha:]]*[[:alpha:]]){2}[^[:alpha:]]*'
Essa instrução selecionará linhas de entrada que não correspondam a mais ou a menos do que dois caracteres alfabéticos que possam ser encontrados em qualquer posição em uma linha de entrada e que possam ser separados por qualquer número de caracteres alfabéticos ^
.
grep
do -x
é usada nos dois casos. Entretanto, qualquer instrução pode dispensar se as âncoras ^
head-of-line e $
tail-of-line fossem (pre | ap) pendentes para o regexp, respectivamente. A opção -x
denota uma correspondência linha inteira - e, portanto, o regexp deve descrever todas as linhas de entrada correspondidas inteiramente, da cabeça à ponta.