長い文字列の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

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

おすすめ記事