我fold -w 3
用来将一行分成多个 3 个字符长,但是对于 GNU 实现,它似乎不适用于具有多字节字符的文本。
我怎样才能实现上述目标sed
?
我想出了sed -r 's/^(.{0,3})(.*)/\1\n\2/g'
但是这只做了一个替换:
echo "111222333444555666" | sed -r 's/^(.{0,3})(.*)/\1\n\2/g'
111
222333444555666
其他示例:
echo "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ" | sed -r 's/^(.{0,3})(.*)/\1\n\2/g'
ĄĄĄ
ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ
并fold
伴随着腐败行为:
echo "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ" | fold -w 3
Ą�
�Ą
Ą�
�Ą
Ą�
简短
grep
的方法:仅保留 3 字符序列:
... | grep -Eo '.{3}'
请注意,问题不在于 Unicode 字符集,而在于以 2 个或更多字节编码的字符(以及宽度不是一个单元格的字符)。
UTF-8 是一种 Unicode 编码,其中字符 U+0080 到 U+10FFFFF 在 2 个或更多字节上编码。Unicode 字符 U+0000 到 U+007F 与 ASCII 相同,在 UTF-8 中编码为单个字节(与 ASCII 相同),在这里不是问题。
Unicode 字符集还有其他编码(如 iso8859-1,单字节,但仅限于字符 U+0000 到 U+00FF,或 GB18030,多字节),还有其他多字节的非 Unicode 字符集编码。
locale charmap
您可以使用该命令来判断您的语言环境中使用的字符编码。目前的 GNU 实现
fold
仅适用于单字节字符。fold
大多数其他系统都没有这个问题。许多甚至可以处理显示宽度为零或双倍的字符。自 2010 年以来,busybox 的实现
fold
一直支持 UTF-8(虽然不是其他多字节字符映射)。在 FreeBSD 或 Solaris 上:
使用busybox折叠:
使用 GNU 折叠:
U+0301 是一个组合的重音。它有一个空宽度,在 UTF-8 中编码为 2 个字节(0xcc 0x81)。所以,那个
á
($'a\u0301'
) 是一个宽度为 1 的字素簇,由 3 个字节上编码的 2 个字符组成,因此有 3 种不同的行为,其中最正确的是 FreeBSD/Solaris' 这里。grep
使用PCRE 支持、UTF-8 语言环境和 UTF-8 输入构建的GNU :o
在输入的每一行上输出1 到 3 个(尽可能多)的所有序列,X
可能会给你更好的结果,比如上面的情况,你将标记与单宽字符组合在一起。如果有双角字符或零与未与单角字符组合的字符或有 TAB、CR、BS 等控制字符,则无济于事。
使用 sed:
或更通用的解决方案(更容易定义字符数):
找到了解决方案:
只是因为...
这是一个POSIX解决方案:
有趣的是,Awk 解决方案比 fold 更高效。
http://stackoverflow.com/questions/1187078/-/23599010