AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 454044
Accepted
Chris Stryczynski
Chris Stryczynski
Asked: 2018-07-08 09:24:15 +0800 CST2018-07-08 09:24:15 +0800 CST 2018-07-08 09:24:15 +0800 CST

折叠的 unicode 安全替代品

  • 772

我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                         
Ą�
�Ą�
�Ą�
sed fold
  • 6 6 个回答
  • 1211 Views

6 个回答

  • Voted
  1. Best Answer
    RomanPerekhrest
    2018-07-08T09:55:14+08:002018-07-08T09:55:14+08:00

    简短grep的方法:

    echo "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ" | grep -Eo '.{1,3}'
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄ
    

    仅保留 3 字符序列:... | grep -Eo '.{3}'

    • 7
  2. Stéphane Chazelas
    2018-12-07T09:59:14+08:002018-12-07T09:59:14+08:00

    请注意,问题不在于 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 上:

        $ echo $'a\u0301bcde' | fold -w3
        ábc
        de
      
    • 使用busybox折叠:

        $ echo $'a\u0301bcde' | busybox fold -w3
        áb
        cde
      
    • 使用 GNU 折叠:

        $ echo $'a\u0301bcde' | fold -w3
        á
        bcd
        e
      

    U+0301 是一个组合的重音。它有一个空宽度,在 UTF-8 中编码为 2 个字节(0xcc 0x81)。所以,那个á( $'a\u0301') 是一个宽度为 1 的字素簇,由 3 个字节上编码的 2 个字符组成,因此有 3 种不同的行为,其中最正确的是 FreeBSD/Solaris' 这里。

    grep使用PCRE 支持、UTF-8 语言环境和 UTF-8 输入构建的GNU :

    grep -Po '\X{1,3}'
    

    o在输入的每一行上输出1 到 3 个(尽可能多)的所有序列,X可能会给你更好的结果,比如上面的情况,你将标记与单宽字符组合在一起。

    如果有双角字符或零与未与单角字符组合的字符或有 TAB、CR、BS 等控制字符,则无济于事。

    • 5
  3. user232326
    2018-07-08T14:38:09+08:002018-07-08T14:38:09+08:00

    使用 sed:

    $ echo "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ" | sed 's/.../&\n/g'
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄ
    

    或更通用的解决方案(更容易定义字符数):

    sed    's/.\{3\}/&\n/g'             # Using BRE (basic) syntax
    sed -E 's/.{3}/&\n/g'               # Using ERE (extended) syntax.
    
    • 3
  4. Chris Stryczynski
    2018-07-08T09:34:56+08:002018-07-08T09:34:56+08:00

    找到了解决方案:

    echo "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ" | sed -r 's/(.{0,3}){1}/&\n/g' 
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    
    • 0
  5. steeldriver
    2018-07-08T15:20:11+08:002018-07-08T15:20:11+08:00

    只是因为...

    $ echo "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ" | gawk '{$1=$1} 1' FPAT=".{,3}" OFS="\n"
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄĄ
    ĄĄ
    
    • 0
  6. Zombo
    2018-07-08T16:21:01+08:002018-07-08T16:21:01+08:00

    这是一个POSIX解决方案:

    awk '{gsub(/.{5}/, "&\n")} 1'
    

    有趣的是,Awk 解决方案比 fold 更高效。

    http://stackoverflow.com/questions/1187078/-/23599010

    • 0

相关问题

  • Linux grep文件1中的内容在文件2中[重复]

  • 如何在第三个逗号后用条件grep行

  • 根据第一个逗号之前的匹配删除重复行数

  • 如何改进这个字符转换脚本?

  • 如何删除两行之间的单行

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve