긴 문자열의 N 문자마다 개행 문자를 삽입하는 방법

긴 문자열의 N 문자마다 개행 문자를 삽입하는 방법

일반적인 bash 도구를 쉘 스크립트의 일부로 사용하여 N 문자 간격으로 긴 문자열에 줄바꿈('\n')을 반복적으로 삽입하고 싶습니다.

예를 들어, 다음 문자열이 있는 경우 20자마다 개행 문자를 어떻게 삽입합니까?

head -n 50 /dev/urandom | tr -dc A-Za-z0-9

내가 달성하려는 결과의 예:

ZL1WEV72TTO0S83LP2I2
MTQ8DEIU3GSSYJOI9CFE
6GEPWUPCBBHLWNA4M28D
P2DHDI1L2JQIZJL0ACFV
UDYEK7HN7HQY4E2U6VFC
RH68ZZJGMSSC5YLHO0KZ
94LMELDIN1BAXQKTNSMH
0DXLM7B5966UEFGZENLZ
4917Y741L2WRTG5ACFGQ
GRVDVT3CYOLYKNT2ZYUJ
EAVN1EY4O161VTW1P3OY
Q17T24S7S9BDG1RMKGBX
WOZSI4D35U81P68NF5SB
HH7AOYHV2TWQP27A40QC
QW5N4JDK5001EAQXF41N
FKH3Q5GOQZ54HZG2FFZS
Q89KGMQZ46YBW3GVROYH
AIBOU8NFM39RYP1XBLQM
YLG8SSIW6J6XG6UJEKXO

한 가지 사용 사례는 고정 길이의 무작위 비밀번호 또는 ID 세트를 빠르게 생성하는 것입니다. 위의 예에서 내가 한 일은 다음과 같습니다.

for i in {1..30}; do head /dev/random | tr -dc A-Z0-9 | head -c 20 ; echo ''; done

그러나 학습 목적으로는 다르게 하고 싶습니다. 임의로 긴 문자열로 시작하고 개행 문자를 삽입하여 문자열을 고정된 문자 길이의 여러 개의 작은 문자열로 분할하고 싶습니다.

답변1

성하fold명령("Written by Bill Joy on June 28, 1977")은 다음을 래핑할 수 있습니다.

$ printf "foobarzot\n" | fold -w 3
foo
bar
zot

그러나 몇 가지 극단적인 경우가 있습니다.

GNU nroff 및 mandoc(1)에 의해 구현된 전통적인 roff(7) 출력 의미 체계는 단일 백스페이스 키만 사용하여 2바이트 문자의 경우에도 이전 문자를 백업합니다. POSIX에서 요구하는 접힌 백스페이스 의미 체계는 백스페이스로 인코딩된 시퀀스를 잘못 처리하여 조기에 줄 바꿈이 발생합니다. fmt(1) 유틸리티는 유사한 기능을 제공하며 이 문제가 발생하지 않지만 POSIX에 의해 표준화되지 않았습니다.

따라서 입력에 백스페이스 문자가 포함된 경우 이러한 문자를 필터링하거나 제거해야 할 수 있습니다.

$ printf "a\bc\bd\be\n" | col -b | fold -w 1
e
$ printf "a\bc\bd\be\n" | tr -d "\b" | fold -w 1
a
c
d
e

답변2

이 답변이 마음에 들지만 fold, 혹시라도 원하신다면 sed다음과 같습니다.

sed 's/.\{20\}/&\
/g' filename

-i내부 삽입 에 사용할 수 있습니다 .

답변3

예를 들어 변수에 내용이 있는 경우:

var=$(head -n 50 /dev/urandom | tr -dc A-Za-z0-9)

그런 다음 변수 길이(20개 블록)에 대해 bash 루프를 사용하여 각 블록을 인쇄할 수 있습니다.

for((start=1;start < ${#var}; start += 20)); do printf '%s\n' "${var:start:20}"; done

별도의 변수로 사용하려면 출력을 배열에 할당하는 것이 좋습니다.

readarray -t passwords < <(for((start=1;start < ${#var}; start += 20)); do printf '%s\n' "${var:start:20}"; done)

답변4

tr -dc인쇄할 수 없는 문자를 제거하기 위해 이 작업을 수행하는 대신 base64coreutils에 있는 것을 사용하겠습니다.

$ base64 -w20 /dev/urandom | head -8
ckXkWvb0zJknz2zi4fRS
3Jv0dDbKiX8fef7SOfbH
QJySlGUzzhi32wvrGliK
YEiuz6v+EFaRYRMjvnJq
HCXIPiP9wmgONLRqm9uK
iHYwo5xIs8gGjQQEQBeX
8NkL4EkmOAHdmWhGvZYl
AcxD2DaTq2TZRsDL+UMx

+문제 가 있는 경우 /교체할 수 있습니다.

$ base64 -w20 /dev/urandom | tr +/ pq | head -8
zr7MgiEr7xBd7h9ihK30
IRNvDuT2H9HsHVq9yFqh
S1cihgfAInjfFspMNXVC
qUUwGErD7nZqtzQtLOo7
DNDp4TVWvHmbEh7HLDGX
GtqqDdEoceY8m5U7FGu0
TvGtTukm6Whr7VHN1mZG
DW5TUH525IA52zLKYACV

관련 정보