在使用sed第一次匹配后插入行

出于某种原因,我似乎无法find一个简单的答案,我现在正处于一个紧张的时刻。 如何在使用sed命令匹配特定string的第一行之后插入文本的select行。 我有 …

 CLIENTSCRIPT="foo" CLIENTFILE="bar" 

我想在CLIENTSCRIPT=行之后插入一行,导致…

 CLIENTSCRIPT="foo" CLIENTSCRIPT2="hello" CLIENTFILE="bar" 

尝试这样做:

 sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file 

如果你想在原地替代 ,使用

 sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file 

产量

 CLIENTSCRIPT="foo" CLIENTSCRIPT2="hello" CLIENTFILE="bar" 

文件

  • 请参阅sed文档和search\a (追加)

请注意标准的sed语法(如在POSIX中一样,所有符合sed实现(GNU,OS / X,BSD,Solaris …)的支持):

 sed '/CLIENTSCRIPT=/a\ CLIENTSCRIPT2="hello"' file 

用于就地编辑的-i选项也是一个GNU扩展,其他一些实现(如FreeBSD的)支持-i ''

或者,为了便于携带,您可以使用perl来代替:

 perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file 

或者你可以使用edex

 printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . wq | ex -s file 

符合POSIX的单线程:

 sed '/CLIENTSCRIPT="foo"/s/.*/&\nCLIENTSCRIPT2="hello"/' file 

我最近不得不处理这个问题,但不仅仅是为了一个文件,而是多个不同的文件,我不能手工完成。 所以我必须find一个脚本。

脚本下载: kinglazy-autoinsert.sh

用法:

kinglazy-autoinsert.sh(list_file)(pattern_file)

参数说明:

list_file =这是包含要编辑的文件列表的绝对path的文件

pattern_file =这是指定要在其下添加新文本的模式(在第一列中)的文件。 在模式下添加的新文本在第二列中指定。 就是这个!

这个脚本节省了时间,并帮助您尽可能以最小的努力完成工作。

依赖关系:无

我有一个类似的任务,并没有得到上面的Perl解决scheme的工作。

这是我的解决scheme:

perl -i -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\n\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf

说明:

使用正则expression式在我的/etc/mysql/my.cnf文件中search仅包含[mysqld] ,并将其replace为

[mysqld] collation-server = utf8_unicode_ci

在包含[mysqld]行之后有效地添加collation-server = utf8_unicode_ci行。