前提:我正在修改我的.profile
,并想为“添加一个大的 ASCII 文本”轮廓“ 由figlet
as生成评论到文件的开头。
我可以分多个步骤完成,但我试图找到一种方法以尽可能短的步骤完成它。
菲莱特生成大的 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 的一种方法应该适用于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
旗帜意味着沉默。
答案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