使用SED的第一场比赛后插入线(Insert line after first match usin

2019-07-22 12:03发布

出于某种原因,我似乎无法找到一个简单的答案,这和我对位的时刻一次紧缩。 我怎么会去使用匹配的特定字符串的第一行之后插入文本的选择权的行sed命令。 我有 ...

CLIENTSCRIPT="foo"
CLIENTFILE="bar"

我想插入后面的线CLIENTSCRIPT=导致行...

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

Answer 1:

试着做这个使用GNU sed的:

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

如果你想替换就地 ,使用

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

产量

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

文件

  • 见SED DOC和搜索\a (追加)


Answer 2:

注意标准sed语法(如POSIX,这么支持的所有符合sed围绕实现(GNU,OS / X,BSD的Solaris ...)):

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

或者在一行:

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

-e Xpressions的(和内容-f尔斯)与换行符加盟来弥补sed脚本sed解释)。

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

另外,对于便携性,你可以用perl ,而不是:

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

或者你可以使用edex

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


Answer 3:

甲POSIX兼容一个使用s命令:

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


Answer 4:

桑达命令在MacOS工作(至少,OS 10)和Unix相似(即不需要GNU的sed像吉尔(目前公认的)人做。):

sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file

这个工程在bash也许其他炮弹太那个知道$“\ n”评测·行情风格。 一切都可以在同一行和中老年/ POSIX sed命令工作。 如果有可能是多行匹配CLIENTSCRIPT =“富”(或同等学历),你只想添加额外行的第一次,你可以按如下返工:

sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file

(这将创建只是通过文件的休息周期,永不又回到了第一个sed命令再行插入代码之后的循环)。

你可能会注意到我加了一个“^ *”来的情况下,匹配模式的行显示了一个评论,说或缩进。 它不是100%完美,但涵盖了可能是一些共同的其他情形。 根据需要调整?

这两种解决方案还避开了问题(对于通用的解决方案还加入了线),如果你的新插入的行包含转义反斜杠或与号,他们将通过战略经济对话来解释,可能不出来一样,就像\n是-例如。 \0将是相匹配的第一行。 尤其是方便的,如果你补充说,来自一个变量行,其中否则你必须使用$ {VAR //}之前,或其他sed的语句等先什么都逃不过

该解决方案是在脚本少一点凌乱(即报价和\ n是不容易的,虽然读),当你不希望在一个行,如果说开始放了一个命令替换文本,在功能与缩进线。 我已经采取了优势在于$“\ n”是由外壳,它不是在正规“\ n”单引号值计算为一个换行符。

它得到足够长的时间,虽然我认为的Perl / awk的,甚至可能由于被更具可读性取胜。



Answer 5:

我也有类似的任务,是不是能够得到上述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]



Answer 6:

我最近不得不解决这个问题,但不只是一个文件,但多个不同的文件,我只是不能做手工。 所以我必须找到一个脚本吧。

脚本下载: kinglazy-autoinsert.sh

用法:

kinglazy-autoinsert.sh(list_file)(pattern_file)

参数说明:

list_file =这是你想编辑包含文件(S)名单的绝对路径的文件

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

该脚本可以节省时间,并帮助您尽可能用最小的努力完成任务。

依赖关系:无



Answer 7:

也许有点晚张贴这个答案,但我发现了一些上述解决方案有点麻烦的。

我想简单的字符串替换在SED和它的工作:

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

符号反映了匹配的字符串,然后添加\ n和新的生产线。

如前所述,如果你想这样做就地:

sed -i 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file

另一件事。 您可以使用匹配的表达式:

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

希望这可以帮助别人



文章来源: Insert line after first match using sed
标签: shell sed