49

我想添加一个特定的行,假设avatar以文件开头MakeFile并且avatar应该添加到文件的第 15 行的文件。

这是向文件添加文本的方法:

echo 'avatar' >> MakeFile.websvc

这就是我认为如何向以 MakeFile 开头的文件添加文本的方法:

echo 'avatar' >> *MakeFile.

但我无法将此行添加到文件的第 15 行。

4

5 回答 5

88

你可以使用sed来解决这个问题:

sed "15i avatar" Makefile.txt

或使用-i选项保存对文件所做的更改。

sed -i "15i avatar" Makefile.txt

要更改以 start 开头的所有文件Makefile

sed "15i avatar" Makefile*

注意:在上面15是您感兴趣的放置文本的行。

于 2013-03-01T12:33:11.317 回答
3

使用 sed :

sed -i '15i\avatar\' Makefile*

其中 -i 选项表示就地发生转换(例如,当您要处理多个文件时,这很有用)。

此外,在您的问题中,*MakeFile 代表“所有以 MakeFile 结尾的文件”,而“所有以 MakeFile 开头的文件”将表示为 MakeFile*。

于 2013-03-01T12:39:30.977 回答
3

如果您需要将字符串和行号选项传递给脚本,请尝试以下操作:

perl -i -slpe 'print $s if $. == $n; $. = 0 if eof' -- -n=15 -s="avatar" Makefile*

-i编辑输入文件,不做备份复制
$.是行号

这是基于我使用 sed 或 awk 在特定行号处插入一行的解决方案,其中包含其他几种将选项传递给 Perl 的方法,以及对命令行选项的解释。

于 2015-09-11T22:11:04.990 回答
2

如果你想要一个更便携的版本,你可以使用ex,它可以在任何*Nix 系统上工作。(它由 POSIX 指定。)目前给出的 Sed 命令依赖于 GNU Sed。

要在当前目录中名称以“Makefile.”开头的每个文件的第 15 行插入只包含“avatar”的行,请使用:

for f in MakeFile.*; do printf '%s\n' 15i 'avatar' . x | ex "$f"; done
于 2016-10-28T04:10:16.973 回答
1
perl -pi -e 'if($.==14){s/\n/\navatar\n/g}if(eof){$.=0}' MakeFile*
于 2013-03-01T12:33:21.147 回答