Eu tenho uma tabela com uma palavra em cada linha. Quero dividir a palavra em caracteres separados por espaço. Existe uma maneira de fazer isso via comando bash?
Se sim, também tenho uma tabela com várias palavras em cada linha.
Entrada:
blind
witt
nakamen
goot
Saída:
b l i n d
w i t t
n a k a m e n
g o o t
Multi mundo:
Entrada:
wat Blinns
allens witter
kemen na
se is goot
Saída:
w a t B l i n n s
a l l e n s w i t t e r
k e m e n n a
s e i s g o o t
Aqui está uma solução Perl que também pode lidar com caracteres Unicode:
Estou usando este arquivo um pouco mais complicado como entrada:
Que dá:
O
-p
meio significa "ler o arquivo de entrada linha por linha, aplicar o script fornecido por-e
a cada linha e depois imprimir a linha resultante". O-C
permite suporte unicode para que possamos lidar com caracteres semelhantesö
e outros caracteres multibyte não-ASCII. Sem ele, você obteria:Então, estamos usando o operador de substituição (
s/old/new/
) com og
sinalizador lobal para substituir todas as ocorrências do padrão. O padrão\S
significa "qualquer caractere que não seja espaço em branco" e o substituímos por ele mesmo ($&
, no lado direito do operador de substituição, significa "o que quer que tenha correspondido") mais um espaço.Adicione o parâmetro -i para fazer alterações no arquivo.
Usando Raku (anteriormente conhecido como Perl_6)
Alternativamente, usando a nova rotina do Raku
comb()
, ou de forma mais convencional comsplit()
:Aqui estão as respostas codificadas em Raku, uma linguagem da família Perl que oferece suporte de alto nível para Unicode. A primeira resposta simplesmente pega cada linha e
print
corresponde a\S
caracteres que não sejam espaços em branco.As próximas duas respostas são semelhantes à excelente resposta Perl postada por @terdon. Observe
$/
como você escreve a variável de captura no Raku ($<>
também funciona). Para quem não gosta de "barra invertida" , você pode colocar parênteses para obter uma captura numerada e usar$0
na substituição. Caso prefira manter espaços em branco entre as palavras, simplesmente exclua as:g/\s//;
afirmação.As duas respostas finais acima usam
comb
a rotina esplit
a rotina de Raku, respectivamente. A nova rotina de Rakucomb()
atua para extrair globalmente correspondências para um Regex desejado. O operador do Rakucomb()
age de forma inversa , permitindo que o Raku proíba Regexes nulos na rotinasplit()
do Raku , o que esperançosamente torna o código do Raku mais robusto.split()
Observe na resposta final que a rotina de Raku ainda usa uma string vaziasplit()
literal .""
Exemplo de entrada (de @terdon):
Exemplo de saída (todas as cinco respostas acima):
Finalmente, para verificar se você removeu todas as strings vazias, etc., você pode adicionar uma chamada à rotina
raku
(orperl
), logo antes de output
. Isso mostrará a representação interna dos dados do Raku (cada linha é um.Seq
objeto iterador):