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 / 问题 / 568407
Accepted
RG7
RG7
Asked: 2020-02-19 22:09:53 +0800 CST2020-02-19 22:09:53 +0800 CST 2020-02-19 22:09:53 +0800 CST

如何将多行文本(即命令中的 o/p)插入文件开头?

  • 772

前提:我正在修改我的.profile, 并想在文件开头添加一个大的 ASCII 文本作为由作为注释生成的“配置文件”。figlet

我可以分多个步骤完成,但我试图找到一种方法以尽可能短的步骤完成。

figlet生成大的 ascii 文本,我使用以下命令附加#到每一行的开头sed:

figlet -f slant "p r o f i l e" | sed -n 's/^.*/#&/p'

上面的输出:

#                               ____   _    __      
#    ____     _____   ____     / __/  (_)  / /  ___ 
#   / __ \   / ___/  / __ \   / /_   / /  / /  / _ \
#  / /_/ /  / /     / /_/ /  / __/  / /  / /  /  __/
# / .___/  /_/      \____/  /_/    /_/  /_/   \___/ 
#/_/

现在,我想将此附加到.profile. 到目前为止,我已经尝试过:sed,xargs 但是,我还没有达到预期的结果,即在一行命令中完成整个过程。

我绝对可以将其分解为 2 行并解决它,但是没有任何解决方案可以在一行中实现这一点吗?

bash shell-script
  • 5 5 个回答
  • 879 Views

5 个回答

  • Voted
  1. Shawn
    2020-02-20T00:38:10+08:002020-02-20T00:38:10+08:00

    另一种使用ex(1),vi/vim等效于ed:

    ex ~/.profile <<EOF
    0r !figlet -f slant "p r o f i l e" | sed 's/^/\#/'
    w
    EOF
    

    在文件的第一行之前插入 figlet 管道的结果,并保存它。

    • 3
  2. Best Answer
    Jetchisel
    2020-02-19T22:52:32+08:002020-02-19T22:52:32+08:00

    一种使用ed(1)which 的方法应该适用于GNU和BSD变体。

    printf '%s\n' '0a' "$(figlet -f slant "p r o f i l e" | sed -n 's/^.*/#&/p')" "" . w | ed -s ~/.profile
    
    • printf '%s\n'就像echo但更通用。
    • "$( )"称为命令替换,它捕获命令的输出。请注意,它用双引号括起来是有原因的。
    • 0是缓冲区/文件中的地址或行号,这是第一行,虽然1i也应该可以工作,但我更喜欢0a因为1i空文件会失败
    • a是表示添加或追加的命令,.
    • ""只是在输出后创建一个空/新行figlet
    • .告诉 ed 我们已经完成了编辑。
    • w意思是写。
    • 然后管道|到ed
    • 带有代表-s沉默的旗帜。
    • 2
  3. seshoumara
    2020-02-20T00:06:46+08:002020-02-20T00:06:46+08:00

    可以一直使用 GNU sed:

    sed -i '1{H;s/.*/figlet -f slant "p r o f i l e"/e;s/^/#/mg;G}' ~/.profile
    

    注意e第一个命令的修饰符s,它执行模式空间,我创建的 figlet 命令。

    • 2
  4. user232326
    2020-03-04T11:00:52+08:002020-03-04T11:00:52+08:00

    由于您已经在使用 sed,您可以通过几个简单的 sed 调用来完成:

    figlet -f slant "p r o f i l e" | sed 's/^./#&/' | sed '' - file
    

    最后一次 sed 调用连接 stdin ( -) 和文件(没有更改)。

    当然,一次调用 awk 就可以做到:

    figlet -f slant "p r o f i l e" | awk 'NR==FNR{gsub(/^/,"#")}1' - file
    

    或者,如果你喜欢ed,你可以这样做:

    echo 'r !figlet -f slant "p r o f i l e"
    ,s/^/#/
    r file
    w
    Q' | ed -s
    

    嗯,你想要一个单行:

    printf '%s\n' 'r !figlet -f slant "p r o f i l e"' ,s/^/#/ 'r file' w Q| ed -s
    

    这意味着:

    printf '%s\n'                           # print each argument on one line.
    'r !figlet -f slant "p r o f i l e"'    # read the output of a sh command.
    ,s/^/#/                                 # insert a # at each line start.
    'r file'                                # read the file
    w                                       # write (the file)
    Q                                       # Quit
    |                                       # pipe the commands to the ed call
    ed -s                                   # call ed in silent mode.
    
    • 0
  5. RudiC
    2020-02-20T03:42:19+08:002020-02-20T03:42:19+08:00

    尝试(未经测试)

    figlet -f slant "p r o f i l e" | sed -n 's/^.*/#&/p' | cat - .profile
    
    • -1

相关问题

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

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

  • MySQL Select with function IN () with bash array

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

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

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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