首页 > 解决方案 > 使用字节数将一行拆分为多行

问题描述

我想将单行拆分为多行,每行 8 个字节。而且我正在使用该fold命令,由于该文件包含特殊字符,因此该fold命令不起作用,并且它在多字节字符的中间中断。

文件内容

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

使用的命令

fold -b8 dummy_file.dat

感谢您对此的任何帮助。

标签: unix

解决方案


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

输出:

echo -n "あいbbえおかcc髙①こさし㈱㈱ちつて髙aabbc" | python max8bytes.py 
あいb b
えお
かcc 髙
①こ
さし
㈱㈱
ちつ
て髙a a
bbc

说明:

您定义一个函数来计算每个字符有多少字节。您逐个字符地读取字符,并且避免在同一行上stdin有多个字节。8如果您不想少于可以在每行末尾添加一些空格字符。


推荐阅读