Usando ferramentas bash comuns como parte de um script de shell, quero inserir repetidamente um caractere de nova linha ('\n') em uma longa string em intervalos de cada N caracteres.
Por exemplo, dada esta string, como eu inseriria um caractere de nova linha a cada 20 caracteres?
head -n 50 /dev/urandom | tr -dc A-Za-z0-9
Exemplo dos resultados que estou tentando alcançar:
ZL1WEV72TTO0S83LP2I2
MTQ8DEIU3GSSYJOI9CFE
6GEPWUPCBBHLWNA4M28D
P2DHDI1L2JQIZJL0ACFV
UDYEK7HN7HQY4E2U6VFC
RH68ZZJGMSSC5YLHO0KZ
94LMELDIN1BAXQKTNSMH
0DXLM7B5966UEFGZENLZ
4917Y741L2WRTG5ACFGQ
GRVDVT3CYOLYKNT2ZYUJ
EAVN1EY4O161VTW1P3OY
Q17T24S7S9BDG1RMKGBX
WOZSI4D35U81P68NF5SB
HH7AOYHV2TWQP27A40QC
QW5N4JDK5001EAQXF41N
FKH3Q5GOQZ54HZG2FFZS
Q89KGMQZ46YBW3GVROYH
AIBOU8NFM39RYP1XBLQM
YLG8SSIW6J6XG6UJEKXO
Um caso de uso é criar rapidamente um conjunto de senhas ou IDs aleatórios de comprimento fixo. A maneira como eu fiz o exemplo acima é:
for i in {1..30}; do head /dev/random | tr -dc A-Z0-9 | head -c 20 ; echo ''; done
No entanto, para fins de aprendizado, quero fazê-lo de uma maneira diferente. Eu quero começar com uma string arbitrariamente longa e inserir novas linhas, quebrando assim uma string em várias pequenas strings de comprimento de caractere fixo.
O comando venerável
fold
("escrito por Bill Joy em 28 de junho de 1977") pode quebrar linhas:No entanto, existem alguns casos extremos
portanto, se sua entrada tiver caracteres de retrocesso, talvez seja necessário filtrar ou remover esses
Eu gosto da
fold
resposta, mas caso você queira comsed
, aqui está:Você pode usar
-i
para inserção no local.Se você tiver o conteúdo em uma variável, como:
Então você pode usar um loop bash sobre o comprimento da variável em pedaços de 20, imprimindo cada pedaço:
Se você as quiser como variáveis individuais, considere atribuir a saída a uma matriz:
Em vez de fazer isso
tr -dc
para se livrar de caracteres não imprimíveis, eu usaria apenasbase64
do coreutils:Se o problema
+
e/
você pode substituí-los: