長い行を特定の行の後に最大長の別々の行に分割します。

長い行を特定の行の後に最大長の別々の行に分割します。

長いBase64文字列(112行目以降)を含む大容量ファイルがあります。最初の112行の一部は80文字を超えるので、そのままにしたいと思います。 112行以降のすべての行を最大80文字に分割したいと思います。

この例では、5行目以降のすべての行を最大80文字に分割します。

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
rcitation ullamco laboris nisi ut aliquip e
rcitation ullamco laboris nisi ut aliquip e
TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg0KcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZQ0KcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZQ==

予想出力:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
rcitation ullamco laboris nisi ut aliquip e
rcitation ullamco laboris nisi ut aliquip e
TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2Vk
IGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlx
WEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY
28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0Z
SBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1b
SBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjd
XBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vb
GxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg0KcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0I
GFsaXF1aXAgZQ0KcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZQ==

sedを使用して行を無視する方法はわかっていますが、最大文字制限を設定して行分割を使用する方法はわかりません。インターネットで検索してみると、折りたたみ式がおすすめです。

fold -w80 input.txt

しかし、折りたたむと線を無視できませんか? Foldまたはsedを使ってこれを行う方法を知っていますか?たぶんちょっと?

ベストアンサー1

-i変更を適用する必要がある場合は、sedを使用してこれを行うことができますinput.txt(ファイルに80文字の行が含まれている場合は、その後に空白行が追加されます)。

sed -E 's/(.{80})/\1\n/g' input.txt

あなたの場合は112行目以降にのみ必要な場合:

sed -E '113,$s/(.{80})/\1\n/g' input.txt
  • 113,$113行目からファイルの終わりまで
  • s/PATTERN/REPLACEMENT/gそれぞれをPATTERN次のように交換します。REPLACEMENT
  • (.{80})80文字セット
  • \1最初のキャプチャグループ

パールの使用:

perl -pe 's/(.{80})(?!$)/\1\n/g if $. > 112' input.txt

おすすめ記事