web-dev-qa-db-ja.com

長い文字列に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つの文字列を固定文字長の複数の小さな文字列に分割します。

12
BugBuddy

由緒ある fold コマンド(「1977年6月28日にBill Joyによって書かれた」)は行を折り返すことができます:

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

ただし、いくつかのEdgeケースがあります

バグGNU nroffとmandoc(1)の両方によって実装された従来のroff(7)出力セマンティクスは、前の文字のバックアップに単一のバックスペースのみを使用します。フォールドバックスペースセマンティクスは、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
17
thrig

私はfoldの回答が好きですが、sedを使用したい場合に備えて、ここに示します。

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

インプレース挿入には-iを使用できます。

10
unxnut

次のような変数の内容がある場合:

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)
3
Jeff Schaller

その代わりにtr -dc印刷できない文字を取り除くために、私はbase64 coreutilsから:

$ 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
1
Uncle Billy