+ -
当前位置:首页 → 问答吧 → 中文自动换行(fold命令不行), 求助各位

中文自动换行(fold命令不行), 求助各位

时间:2011-03-11

来源:互联网

本帖最后由 惟吾无为 于 2011-03-11 21:30 编辑

如题, 要阅读的文档 中英文混杂, 有的行很长, 用less在终端显示时会出现乱码.
用cat时, 每个显示行的结尾几个字符会被终端吞掉...且不能翻页查看(触屏坏了, 外接鼠标不方便)
因此打算自己对含有中文的文档进行显示, 控制翻页查看, 虽然效率比less差, 至少可以正常看中文了.

能处理gbk文本就行, 支持utf8更好...

文档中可能含有tab(制表符), 希望可以通过一个环境变量来定义tab的宽度, sed或awk可以根据这个变量来处理tab, 从而换行时tab不会因被当做一个字符而导致显示混乱. (这个不是必须要加的, 不行的话就默认8个空格的长度就是了)

大家若是觉得那里不清楚, 可以提问, 或先看我3楼贴的bash代码, 已经加了不少注释了.

自己用内建命令(在3楼贴出)写的不行, 宽度37, 处理472字节花了1.003s(未处理tab), in 336MHz的jz4740 CPU(诺亚舟网络学习机np1500).
各位可否提些好的建议, 或是给个awk或sed或其他的脚本. 如有可能, C/C++. 不好意思, 我目前只会bash...
无perl, 无python.
gawk 3.1.0
gnu sed 3.02
bash 2.05a
fold 属busybox1.16.0的
less 属busybox1.16.0的
自己尝试编译less418, less -rMf 查看时, 不能自动换行, 阅读很不方便

自己以 "linux 中文自动换行"等为关键词google无果

作者: 惟吾无为   发布时间: 2011-03-11

没看懂 问题挑的不清楚

作者: chenbin200818   发布时间: 2011-03-11



QUOTE:
没看懂 问题挑的不清楚
chenbin200818 发表于 2011-03-11 20:45




    重新编辑了下要求, 顺便贴上自己的代码


  1. #!/bin/bash

  2. # 把文本保存进变量, 方便稍后截取
  3. STR="$( cat text.txt)"

  4. # 每行最大长度, 即每多少字符进行换行
  5. W=37

  6. # 已处理字节数
  7. A=0
  8. # 已处理行数
  9. L=0

  10. # 文本的总字节数
  11. LEN_STR=${#STR}

  12. # echo "$STR"

  13. # 已处理字节数小于文本总字节数时
  14. while [[ $A -lt $LEN_STR ]]
  15. do

  16. #本行已处理字节数
  17. P=0
  18. #本行处理后的内容
  19. PSTR=

  20. #从 总已处理字节数 处截取后面的 每行最大长度 个字符.
  21. SSTR=${STR:A:W}
  22. #截取字串的长度
  23. SW=${#SSTR}

  24. #已处理字节数小于截取字串的长度
  25. while [[ $P -lt $SW ]]
  26. do
  27. #预取一个字符
  28. pc=${SSTR:P:1}
  29. case "$pc" in
  30. [[:ascii:]]) # ascii字符, 即单字符的, 该字符通过, 已处理字节数加1
  31. P=$((P+1))
  32. char="$pc"
  33. ;;
  34. *) # 非ascii字符, 非utf8的, 可能双字符, 取2字节后通过, 已处理字节数加2
  35. char=${SSTR:P:2}
  36. P=$((P+2))
  37. ;;
  38. esac

  39. # 以处理的字串
  40. PSTR="$PSTR$char"   
  41. done

  42. # 如果P值大于SW, 说明最后一个字符是双字节的, 且超过了 每行最大长度
  43. if [[ $P -gt $SW ]]
  44. then
  45. P=$((P-2))
  46. # 所以P减2, 重新截取出 已处理字串
  47. PSTR="${PSTR:0:P}"
  48. fi
  49. echo "$PSTR "

  50. # 加上该加的 已处理字节数, 已处理行数
  51. A=$((A+P))
  52. L=$((L+1))
  53. done
复制代码

作者: 惟吾无为   发布时间: 2011-03-11

目前只打算处理gbk文本, 所以定为双字节模式

作者: 惟吾无为   发布时间: 2011-03-11