由于某些原因,我似乎找不到一个直接的答案,而且我现在的时间有点紧张。 我如何使用sed
命令在第一行匹配一个特定的字符串后插入一个选择行的文本。 我有...
CLIENTSCRIPT="foo"
CLIENTFILE="bar"
我想在CLIENTSCRIPT=
行后插入一行,结果是 ...
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
试试用GNU sed做这个:
sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file
如果你想用_in-place_替代,请使用
sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
a
(附加)。注意标准的sed
语法(如POSIX,所以被周围所有符合要求的sed
实现所支持(GNU、OS/X、BSD、Solaris...)):
sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file
或者在一行中:
sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file
(-e
表达式(和-f
文件的内容)用换行符连接起来,组成了sed
解释的sed脚本)。
用于原地编辑的-i
选项也是GNU的扩展,其他一些实现(如FreeBSD'的)支持-i''
。
另外,为了便于移植,你可以用perl
代替:
perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file
或者你可以使用ed
或ex
:
printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file
我有一个类似的任务,但无法让上述perl解决方案发挥作用。
下面是我的解决方案:
perl -i -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\n\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf
解释:
使用正则表达式搜索我的/etc/mysql/my.cnf文件中只包含[mysqld]
的一行,并将其替换为
[mysqld] Collation-server = utf8_unicode_ci
。
有效地将 "collation-server = utf8_unicode_ci "行添加到包含"[mysqld]"的那一行之后。