在多个文件中添加一行文本


10

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


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

我想在结束之前插入一行

</ VirtualHost>
标签。我的第一个假设是,我应该能够使用sed进行此操作,可能是匹配并替换了该标签。我现在将开始尝试此操作,但是如果任何人都可以使用现有的方法来执行此操作,我将很乐意听到。


当我说这是编程任务时,我会说实话...因此应该如此。我会用Perl做到这一点,特别是因为我敢打赌,这里有一个Perl模块旨在解析和修改apache配置。
xenoterracide

2
谢谢,但是使用简单的unix工具应该很容易完成这项任务,因此请在此处提出。不过,感谢您的评论。
gabe。

Answers:


10

像这样:

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

太棒了...这就是我想要的。
gabe。

1
千万不能解析LS。请改用glob。mywiki.wooledge.org/ParsingLs
克里斯·

你是严厉的@ChrisDown。请改善我的答案。
lcipriani 2011年

选择/与sed表达式不同的字符更为简洁,因为您不必逃脱斜线:'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
亚历山大(Alexander

2

如果您不介意Perl,请尝试:

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

-i开关将节省您的旧文件,一个.old延伸和打印到当前的一个。


2

如果您要进行的编辑有些复杂,也可以使用“ 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 /将起作用。


0

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

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.