使用bash

时间:2016-11-29 22:06:05

标签: linux bash ubuntu sed scripting

我有一个文件abc.txt,如下所示:

#%PAM-1.0
# Test file
# Hello World
#
# echo "Test"
/etc/init.d/xrdp start

# Comment again
echo "Hello again"

我想在评论后插入一行作为第一个可执行行...所以如果我想在所有行以#开头之后添加一行echo "Batman",我该如何实现呢?

输出应如下所示:

#%PAM-1.0
# Test file
# Hello World
#
# echo "Test"
echo "Hello Batman"
/etc/init.d/xrdp start

# Comment again
echo "Hello again"

请注意,该行不会在其他评论专栏# Comment Again

之后添加

我在下面试过,但它没有用。我是Bash脚本的新手,所以需要专家的帮助。

sed -i '#/a "echo "Batman"' abc.txt

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

只需使用标记即可记录此行的打印时间:

awk '!/^#/ && !f{print "Hello Batman";f=1}1' file

即:当一行不以#开头并且这是第一次发生时,打印所需的行。然后,设置标志,这样就不会再发生了。

最后,1会触发输出当前行的print

答案 1 :(得分:1)

使用GNU Sed

插入已知文本之前

使用GNU sed,您可以通过而不是使您的模式匹配过于通用,从而更轻松地执行您想要的操作。在实际的语料库中,您可以在第一行之前插入文本,而不是尝试以非贪婪的方式匹配任意数量的注释行。例如:

select b.*
from balls b
where not exists (select 1
                  from boxings bxb join
                       boxes bo
                       on bxb.box_id = bo.id
                  where bxb.ball_id = b.id and bo.locked = 1
                 );

如果您确实需要更通用的方法来执行此操作,那么在修改文本之前,您必须更加努力地将文本拆分为段落或部分。这通常比保证工作更多,但你的里程可能会有所不同。