向多个文件添加一行文本

向多个文件添加一行文本

因此,我的目录中有一堆文件,我需要在每个文件中插入一行文本。它们基本上具有以下格式:


<VirtualHost *:80>
        ServerAdmin gabe@localhost
        DocumentRoot /var/www/test1
        ServerName test1.local
        ServerAlias test1
        <Directory "/var/www/test1">
                Options All
                AllowOverride All
        </Directory>
</VirtualHost>

我想在结束之前插入一行

</虚拟主机>
标签。我的第一个假设是我应该能够使用 sed 来完成此操作,可能匹配并替换该标签。我现在要开始尝试这个,但如果有人有现有的方法可以做到这一点,我很想听听。

答案1

像这样的东西:

sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'

作品。如果您想对很多文件重复此命令,您可以执行以下操作:

for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done

感谢@ChrisDown,可能更好(但未经测试):

find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\ 
done

答案2

如果你不介意 Perl 尝试:

perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

-i开关将使用扩展名保存旧文件.old并打印到当前文件。

答案3

如果您想要进行的编辑有些复杂,您也可以使用“ex”(命令行 vi)。例如,您只想对“”的一个实例进行插入。

像这样的 shell 脚本可以工作:

for FILENAME in *.whatever  # Need a criteria to glob, or a list of names
do
    ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done

这种方法为您提供了“ex”的优点:找到具有精心设计的模式的位置和“光标移动”。您可以执行诸如查找模式,然后查找下一个实例,然后执行插入之类的操作。或者您可以更改文本,而不仅仅是进行插入。或者您可以在范围之间进行更改。不要忘记“ex”允许您使用“.”。作为当前行,因此 .,/^somepatter/s/blah/foo/ 将起作用。

答案4

您可以使用以下单行代码将单行或多行插入到文件中的给定位置(在本例中为“VirtualHost”之前)。该代码基本上在给定目录及其子目录中搜索文件名(如果您想在所有文件中插入文本,则可以是 *.*)。在找到的文件中,它搜索模式“VirtualHost”。找到该模式后,它会将其替换为firstline\nsecondline\notherlines\n\VirtualHost。请注意,“VirtualHost”是替换文本的一部分,否则我们将丢失它。

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'

相关内容