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 / 问题 / 489775
Accepted
BugBuddy
BugBuddy
Asked: 2018-12-19 13:40:26 +0800 CST2018-12-19 13:40:26 +0800 CST 2018-12-19 13:40:26 +0800 CST

如何将每N个字符的换行符插入一个长字符串[重复]

  • 772
这个问题在这里已经有了答案:
如何在长行中每四个字符插入一个空格? (8 个回答)
3年前关闭。

使用常见的 bash 工具作为 shell 脚本的一部分,我想每隔 N 个字符重复插入一个换行符('\n')到一个长字符串中。

例如,给定这个字符串,我如何每 20 个字符插入一个换行符?

head -n 50 /dev/urandom | tr -dc A-Za-z0-9

我试图达到的结果示例:

ZL1WEV72TTO0S83LP2I2
MTQ8DEIU3GSSYJOI9CFE
6GEPWUPCBBHLWNA4M28D
P2DHDI1L2JQIZJL0ACFV
UDYEK7HN7HQY4E2U6VFC
RH68ZZJGMSSC5YLHO0KZ
94LMELDIN1BAXQKTNSMH
0DXLM7B5966UEFGZENLZ
4917Y741L2WRTG5ACFGQ
GRVDVT3CYOLYKNT2ZYUJ
EAVN1EY4O161VTW1P3OY
Q17T24S7S9BDG1RMKGBX
WOZSI4D35U81P68NF5SB
HH7AOYHV2TWQP27A40QC
QW5N4JDK5001EAQXF41N
FKH3Q5GOQZ54HZG2FFZS
Q89KGMQZ46YBW3GVROYH
AIBOU8NFM39RYP1XBLQM
YLG8SSIW6J6XG6UJEKXO

一个用例是快速制作一组随机密码或固定长度的 ID。我做上面例子的方式是:

for i in {1..30}; do head /dev/random | tr -dc A-Z0-9 | head -c 20 ; echo ''; done

但是,出于学习目的,我想以不同的方式进行。我想从一个任意长的字符串开始并插入换行符,从而将一个字符串分成多个固定字符长度的小字符串。

bash shell-script
  • 4 4 个回答
  • 9008 Views

4 个回答

  • Voted
  1. Best Answer
    thrig
    2018-12-19T17:07:30+08:002018-12-19T17:07:30+08:00

    古老的fold命令(“由 Bill Joy 于 1977 年 6 月 28 日编写”)可以换行:

    $ printf "foobarzot\n" | fold -w 3
    foo
    bar
    zot
    

    但是,有一些边缘情况

    BUGS 由 GNU nroff 和 mandoc(1) 实现的传统 roff(7) 输出语义只使用一个退格键来备份前一个字符,即使是双宽字符也是如此。POSIX 所需的折叠退格语义错误地处理了此类退格编码序列,提前断行。fmt(1) 实用程序提供了类似的功能并且不会遇到这个问题,但它没有被 POSIX 标准化。

    因此,如果您的输入有退格字符,您可能需要过滤或删除那些

    $ printf "a\bc\bd\be\n" | col -b | fold -w 1
    e
    $ printf "a\bc\bd\be\n" | tr -d "\b" | fold -w 1
    a
    c
    d
    e
    
    • 25
  2. unxnut
    2018-12-19T16:41:25+08:002018-12-19T16:41:25+08:00

    我喜欢这个fold答案,但以防万一你想要sed,这里是:

    sed 's/.\{20\}/&\
    /g' filename
    

    您可以-i用于就地插入。

    • 17
  3. Jeff Schaller
    2018-12-19T18:22:06+08:002018-12-19T18:22:06+08:00

    如果变量中有内容,例如:

    var=$(head -n 50 /dev/urandom | tr -dc A-Za-z0-9)
    

    然后你可以在变量的长度上使用 bash 循环,以 20 个块为单位,打印出每个块:

    for((start=1;start < ${#var}; start += 20)); do printf '%s\n' "${var:start:20}"; done
    

    如果您希望它们作为单个变量,请考虑将输出分配给数组:

    readarray -t passwords < <(for((start=1;start < ${#var}; start += 20)); do printf '%s\n' "${var:start:20}"; done)
    
    • 3
  4. Uncle Billy
    2018-12-20T00:09:21+08:002018-12-20T00:09:21+08:00

    而不是做那tr -dc件事来摆脱不可打印的字符,我只会使用base64coreutils:

    $ base64 -w20 /dev/urandom | head -8
    ckXkWvb0zJknz2zi4fRS
    3Jv0dDbKiX8fef7SOfbH
    QJySlGUzzhi32wvrGliK
    YEiuz6v+EFaRYRMjvnJq
    HCXIPiP9wmgONLRqm9uK
    iHYwo5xIs8gGjQQEQBeX
    8NkL4EkmOAHdmWhGvZYl
    AcxD2DaTq2TZRsDL+UMx
    

    如果+and/有问题,您可以更换它们:

    $ base64 -w20 /dev/urandom | tr +/ pq | head -8
    zr7MgiEr7xBd7h9ihK30
    IRNvDuT2H9HsHVq9yFqh
    S1cihgfAInjfFspMNXVC
    qUUwGErD7nZqtzQtLOo7
    DNDp4TVWvHmbEh7HLDGX
    GtqqDdEoceY8m5U7FGu0
    TvGtTukm6Whr7VHN1mZG
    DW5TUH525IA52zLKYACV
    
    • 1

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • MySQL Select with function IN () with bash array

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

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