Проблема в том, что ваш текст содержит многобайтовые символы, которые будут разбиты командой fold
, если мы разделим их на 2 строки.
echo "あいbbえおかcc髙①こさし㈱㈱ちつて髙aabbc" | fold -b8
あいbb
えお��
�cc髙��
�こさ�
��㈱㈱
ちつ��
�髙aabb
c
Если вы хотите, чтобы в каждой строке было по 8 символов, вы можете использовать следующую команду sed
:
echo "あいbbえおかcc髙①こさし㈱㈱ちつて髙aabbc" | sed 's/.\{8\}/&\n/g'
あいbbえおかc
c髙①こさし㈱㈱
ちつて髙aabb
c
, которая добавляет разрывную строку после каждого вхождения 8
символов.
Если вы не хотите отображать 8 символов, но хотите, чтобы каждая строка не превышала 8 байтов без разбивки текстового содержимого, вы можете использовать скрипт python:
import sys
def utf8len(s):
return len(s.encode('utf-8'))
entry = unicode(sys.stdin.read(),'utf-8')
tmp = ''
for c in entry:
if utf8len(tmp)+utf8len(c) > 8:
print tmp
tmp = c
elif utf8len(tmp)+utf8len(c) == 8:
print tmp,c
tmp = ''
else:
tmp += c
if tmp:
print tmp
output:
echo -n "あいbbえおかcc髙①こさし㈱㈱ちつて髙aabbc" | python max8bytes.py
あいb b
えお
かcc 髙
①こ
さし
㈱㈱
ちつ
て髙a a
bbc
Пояснения:
Вы определяете функцию, которая будет подсчитывать количество байтов на символ.Вы читаете char по символу stdin
и избегаете, чтобы в одной строке было больше 8
байтов.Если вы не хотите иметь меньше чем, вы можете добавить несколько пробелов в конце каждой строки.