разбить одну строку на несколько строк, используя количество байтов - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу разбить одну строку на несколько строк по 8 байт каждая.И я использую команду fold, и поскольку этот файл содержит специальные символы, команда fold не работает и прерывается в середине многобайтового символа.

Содержимое файла

あいbbえおかcc髙①こさし㈱㈱ちつて髙aabbc

Используемая команда

fold -b8 dummy_file.dat

Оцените любую помощь по этому вопросу.

1 Ответ

0 голосов
/ 25 февраля 2019

Проблема в том, что ваш текст содержит многобайтовые символы, которые будут разбиты командой 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 байтов.Если вы не хотите иметь меньше чем, вы можете добавить несколько пробелов в конце каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...