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

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

前提:我正在修改我的.profile,并想为“添加一个大的 ASCII 文本”轮廓“ 由figletas生成评论到文件的开头。

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

菲莱特生成大的 ascii 文本,并#使用以下命令附加到每行的开头sed

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

上面的输出:

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

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

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

答案1

另一种使用ex(1)vi/vim相当于ed

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

将 Figlet 管道的结果插入到文件第一行之前,然后保存。

答案2

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

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旗帜意味着沉默。

答案3

人们可以一路使用 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 命令。

答案4

尝试(未经测试)

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

相关内容