出于某种原因,我似乎找不到一个直截了当的答案,我现在有点时间紧张。如何使用sed命令在匹配特定字符串的第一行之后插入选择的文本行呢?我有……
CLIENTSCRIPT="foo"
CLIENTFILE="bar"
我想在CLIENTSCRIPT=行之后插入一行,导致…
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
出于某种原因,我似乎找不到一个直截了当的答案,我现在有点时间紧张。如何使用sed命令在匹配特定字符串的第一行之后插入选择的文本行呢?我有……
CLIENTSCRIPT="foo"
CLIENTFILE="bar"
我想在CLIENTSCRIPT=行之后插入一行,导致…
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
当前回答
一个POSIX兼容的,使用s命令:
sed '/CLIENTSCRIPT="foo"/s/.*/&\
CLIENTSCRIPT2="hello"/' file
其他回答
我有一个类似的任务,并不能得到上述perl解决方案的工作。
以下是我的解决方案:
我的名字叫perl - f
解释:
使用正则表达式搜索/etc/mysql/my.cnf文件中仅包含[mysqld]的一行,并将其替换为
(mysqld) Collation-server = utf8_unicode_ci
在包含[mysqld]的行之后有效地添加sort -server = utf8_unicode_ci行。
注意标准sed语法(就像在POSIX中一样,所以所有符合sed的实现都支持(GNU, OS/X, BSD, Solaris…)):
sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file
或者在一行上:
sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file
(-expression(以及-files的内容)用换行符连接,组成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
awk变体:
awk '1;/CLIENTSCRIPT=/{print "CLIENTSCRIPT2=\"hello\""}' file
也许现在给出答案有点晚了,但我发现上面的一些解决方案有点麻烦。
我尝试了简单的字符串替换sed和它工作:
sed 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file
&符号反映匹配的字符串,然后添加\n和新行。
如前所述,如果你想就地完成:
sed -i 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file
另一件事。您可以使用表达式进行匹配:
sed -i 's/CLIENTSCRIPT=.*/&\nCLIENTSCRIPT2="hello"/' file
希望这对大家有所帮助
一个POSIX兼容的,使用s命令:
sed '/CLIENTSCRIPT="foo"/s/.*/&\
CLIENTSCRIPT2="hello"/' file