因此,我的目录中有一堆文件,我需要在每个文件中插入一行文本。它们基本上具有以下格式:
<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'