繁体   English   中英

使用bash在文件中的模式之后插入一行

[英]Insert a line after a pattern in a file using bash

我有一个文件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

谢谢你的帮助!

只需使用一个标志来跟踪何时打印此行:

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

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

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

使用GNU Sed插入已知文本之前

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

$ sed --in-place '/^\/etc\/init.d\/xrdp start/i\echo "Batman"' /tmp/abc.txt
#%PAM-1.0
# Test file
# Hello World
#
# echo "Test"
echo "Batman"
/etc/init.d/xrdp start

# Comment again
echo "Hello again"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM