我正在尝试编写一个bash脚本,为一个不断增长的文件段添加一个新行。每次我运行脚本时,都应该在该段落中添加一个新行,但它会返回文件的全部内容。
这是我的代码......
function registerServiceProvider {
# register service provider inside config/app.php
sed '/App\Providers\*::class,/a \ App\Providers\${repoName}${provider}::class,' ./config/app.php
}
registerServiceProvider
答案 0 :(得分:1)
默认情况下sed
将结果流打印到stdout
。如果你有GNU sed,你可以使用-i
来就地修改文件。对于许多BSD sed
,您可以使用-i
,但它需要一个参数,该参数将添加到创建的备份文件中。
如果您希望保留更多POSIXy,可以将输出重定向到新文件,然后将该临时文件移到旧名称上(或重定向输出以确保您不会更改权限)。尽管如此,不要尝试使用重定向来执行此操作,因为shell将执行的第一件事是截断文件,然后您将尝试读取它并且它将为空。
所以,使用GNU sed,你可以这样做:
sed -i -e '/App\Providers\*::class,/a \ App\Providers\${repoName}${provider}::class,' ./config/app.php
或使用BSD(或GNU,参数有效但GNU是可选的)
sed -i .bak -e '/App\Providers\*::class,/a \ App\Providers\${repoName}${provider}::class,' ./config/app.php
或便携式
sed '/App\Providers\*::class,/a \ App\Providers\${repoName}${provider}::class,' ./config/app.php > tmp_paragraph
cat tmp_paragraph > ./config/app.php
rm tmp_paragraph
如果希望repoName
和provider
变量是扩展的shell变量,则需要将sed脚本放在双引号中。 bash不会在单引号字符串中扩展变量。因此,要采用GNU sed示例,您可以将其更改为使用双引号,如下所示:
sed -i -e "/App\\\\Providers\\\\*::class,/a \\ App\\\\Providers\\\\${repoName}${provider}::class," ./config/app.php
并注意我们必须做大量额外的斜线转义,因为bash会将它们视为双引号内的转义字符。我们可以使用单引号来帮助解决这个问题,只要我们将变量置于其外部(并注意我仍然会将引号加倍,因为我认为你打算这样做以获得实际的反斜杠点)
sed -i -e '/App\\Providers\\*::class,/a \ App\\Providers\\'${repoName}${provider}'::class,' ./config/app.php