使用bash为不断增长的段落添加新行

时间:2016-10-07 11:49:40

标签: linux bash

我正在尝试编写一个bash脚本,为一个不断增长的文件段添加一个新行。每次我运行脚本时,都应该在该段落中添加一个新行,但它会返回文件的全部内容。

这是我的代码......

function registerServiceProvider {
   # register service provider inside config/app.php
   sed '/App\Providers\*::class,/a \ App\Providers\${repoName}${provider}::class,' ./config/app.php
}
registerServiceProvider

1 个答案:

答案 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

如果希望repoNameprovider变量是扩展的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