在脚本中的多个文件上使用sed

时间:2012-03-31 22:08:06

标签: linux bash shell

我有一个sed脚本,可以在文件中找到关键字“MYWORD”之前插入一行。我的脚本如下:

sed -e '/MYWORD/ i\MY NEW LINE TO BE INSERTED' <inputFilename >outputFilename

由于这只会在一个文件上发生,我如何更改脚本以在目录中的每个文件上进行此插入?

1 个答案:

答案 0 :(得分:1)

正如nosid所说,您可以使用-i选项来编辑文件。阅读您的操作系统中的手册页,以确定如何使用-i。然后你可以用一些shell脚本包装sed来识别文件并对其进行操作:

for this in foo*.txt; do
  sed -i'' -e 'your-sed-script' "$this"
done

那就是说,我不确定你的插入方法是否有效,或者至少可靠地工作。我在FreeBSD和OS X中测试过,它根本不起作用。我插入行的常规策略是使用awk。因此(例如):

for this in foo*.txt; do
  awk '/MYWORD/{print "Extra line of text goes here."} 1' "$this" > "$this.$$"
  mv "$this.$$" "$this"
done

此处的awk行搜索/ MYWORD /(扩展正则表达式,而sed默认为基本正则表达式)。如果找到它,它首先打印“额外”文本。然后,“1”评估为“true”,也将打印当前行。效果是在MYWORD之前的行上插入“Extra”文本。

请注意,这不是好的脚本。这是浪费,管道和重命名尚未修改的文件。您可以通过选择根据awk的退出值选择“mv”临时文件来改进它,或者您可以使用cmp来确定文件是否已更改,然后清理剩余的临时文件等...但是它明白了。