一般的な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
1つのユースケースは、固定長のランダムパスワードまたは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
印刷できない文字を削除するためにこれを行うのではなく、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