Se eu não conheço muito bem o conjunto (ou seu complemento) , geralmente não confio em negação - especialmente em intervalos. Eu não sei a primeira coisa sobre a maioria desses personagens em sua string feia, ou de onde eles vieram, ou se meu computador se importa. Eu conheço alguns dos outros, e sei como remover qualquer coisa, mas - desde que todos os personagens feios sejam pelo menos caracteres válidos.
alnum=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
sed -e's|.|&\n|g' -e'# this opens up the string' \
-e"s|\([-$alnum*_+ßäüö ()%&@=.$€]\)\{0,1\}.\{0,1\}\n|_|g" \
<<""
testflŒÆ˘ˆı››◊‹ıÓÌˇˆÁÓˆfl̈™ˇÏˆıÍÓÌıÓWÌtest
testWtest
^ isso é certo, certo?
Então, ele divide a string em um \n
ewline por caractere e, em seguida, verifica a string um caractere por vez, da esquerda para a direita. Ao fazê-lo, ele fará uma de duas coisas para cada uma delas: substituirá um dos seus caracteres na lista de desbloqueio por 0 ou 1 ocorrências de si mesmo ou removerá 0 ou 1 ocorrências de algum outro caractere. Em ambos os casos, também remove o delimitador de nova linha à direita.
Acho mais fácil ver o que acontece com _
underscores - (que é provavelmente o motivo pelo qual você os incluiu) :
sed -e's|.|&\n|g' -e'# this opens up the string' \
-e"s|\([-$alnum*_+ßäüö ()%&@=.$€]\)\{0,1\}.\{0,1\}\n|_|g" \
<<""
testflŒÆ˘ˆı››◊‹ıÓÌˇˆÁÓˆfl̈™ˇÏˆıÍÓÌıÓWÌtest
_ _ _ _t_e_s_t________________________________W__t_e_s_t_
Isso é o que o sed
fará com a substituição de uma cadeia de caracteres de comprimento nula . Remover é bom - mas sed
pode pegar ou deixar, e irá . Ah, os espaços, bem, eu apenas copiei e colei no terminal e então os quatro personagens principais (para o recuo do bloco de código Markdown) eram espaços.
Um motivo pelo qual eu uso o \n
ewlines tem a ver com o que acontece com uma seqüência de bytes inválida no espaço padrão. Se não resultar em um caractere real, .
não corresponderá e /^.*$/
falhará. Com as novas linhas, se algum caractere seguindo a sequência de byte ruim conseguir corresponder a .
em primeiro lugar, então:
sed '/^.*$/!{/\n/D;}'
... funcionará depois (mas não com um GNU sed
- acho que eu deveria ter verificado primeiro. Eu estava usando o AST sed
anterior - o que não é um problema) . Com% GNUsed
z
irá z
ap todo o espaço padrão.