Eu tenho uma linha longa que quero inserir um espaço a cada 4 caracteres, em uma única linha solitária de texto sólido para facilitar a leitura, qual é a maneira mais simples de fazer isso? também eu deveria poder inserir a linha de um cano. por exemplo
echo "foobarbazblargblurg" | <some command here>
dá
foob arba zbla rgbl urg
command-line
shell
text-processing
xenoterracida
fonte
fonte
sed
eu tentei primeiro eu poderia me chutar.'s/.\{4\}/& /g;s/ $//'
Você pode usar o seguinte exemplo simples:
fonte
sed
resposta. Eu não sabiafold
antes.fold
, ele não funciona com caracteres de vários bytes (comoecho €€€€€€€€ | fold -w4 | paste -sd' ' -
em UTF-8).Aqui está o exemplo usando
grep
exargs
:fonte
xargs
é executadoecho
por padrão, portanto, não funcionará com palavras como-nen
ou que contenham barras invertidas, dependendo daecho
implementação. Você verá o caractere de nova linha ímpar de vez em quando, se o xargs executar mais de umecho
. Melhor canalizar para opaste -sd ' ' -
lugar. Observe que-o
não é uma opção padrão.Somente no bash, sem comandos externos:
ou como uma versão de tubo de uma linha:
A maneira como isso funciona é converter cada caractere da sequência de caracteres em um "(.)" Para corresponder e capturar regex com
=~
, e apenas gerar as expressões capturadas daBASH_REMATCH[]
matriz, agrupadas conforme necessário. Os espaços à esquerda / à direita / intermediários são preservados, remova as aspas"${BASH_REMATCH[@]:1}"
para omiti-las.Aqui está envolvido em uma função, esta processará seus argumentos ou lerá stdin se não houver argumentos:
Você pode facilmente parametrizar a contagem para ajustar a sequência de formatação de acordo.
Um espaço à direita é adicionado, use dois
printf
s em vez de um se isso for um problema:A primeira
printf
imprime (até) os 4 primeiros caracteres, a segunda imprime condicionalmente todo o restante (se houver) com um espaço à esquerda para separar os grupos. O teste é para 5 elementos e não 4 para dar conta do elemento zeroth.Notas:
printf
s'%c
pode ser usado em vez de%s
,%c
(talvez) faz a intenção mais clara, mas não é multi-byte caráter. Se a sua versão do bash for capaz, as opções acima são seguras para caracteres de vários bytes.printf
reutiliza sua string de formatação até ficar sem argumentos, portanto, apenas devolve 4 argumentos por vez e lida com os argumentos à direita (portanto, não são necessários casos extremos, ao contrário de algumas das outras respostas aqui que estão indiscutivelmente erradas)BASH_REMATCH[0]
é a sequência correspondente completa, portanto, apenas a saída começa no índice 1printf -v myvar ...
vez disso, use para armazenar em uma variávelmyvar
(sujeita ao comportamento usual de leitura / loop / subcamação)printf "\n"
se necessárioVocê pode fazer o trabalho acima
zsh
se usar a matriz emmatch[]
vez deBASH_REMATCH[]
e subtrair 1 de todos os índices, poiszsh
não mantém um elemento 0 com a correspondência inteira.fonte
Com
zsh
apenas:Ou
com
ksh93
apenas:Somente com qualquer shell POSIX (evitando também o espaço à direita se o comprimento da entrada for múltiplo de 4):
Agora, isso é para personagens . Se você quiser fazer isso em clusters de grafema (por exemplo, quebrar
Stéphane
, escritos como$'Ste\u0301phane'
, comoStép hane
e nãoSte phan e
), comzsh
:Com o ksh93, você também pode alterar a largura de exibição, o que funcionaria para isso
Stéphane
acima, mas também pode ajudar quando outros tipos de caracteres de largura zero ou largura dupla estão envolvidos:fonte
Vou responder inserindo apenas os espaços necessários, para que um espaço apareça pelo menos a cada 4 caracteres em uma linha; não tenho certeza de como você deseja lidar com este caso. Por exemplo, dada a entrada de "aa bbccdd", você obteria a saída "aa bbcc dd" em vez de "aa b bccd d".
Estou usando o Perl para procurar, mas não estou muito familiarizado com o Perl em geral, portanto, pode haver ajustes necessários:
fonte
Eu fiz isso usando python
Primeiro eu estou lendo o arquivo, então eu estou dividindo por 4 caracteres e adicionando espaço
/root/l.txt ==> Consiste no conteúdo que você forneceu no exemplo
saída
fonte