Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在脚本中的多个文件上使用sed_Linux_Bash_Shell - Fatal编程技术网

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

Linux 在脚本中的多个文件上使用sed,linux,bash,shell,Linux,Bash,Shell,我有一个sed脚本,在文件中找到的关键字“MYWORD”之前插入一行。我的脚本如下: sed -e '/MYWORD/ i\MY NEW LINE TO BE INSERTED' <inputFilename >outputFilename sed-e'/MYWORD/i\MY NEW LINE TO insert'outputFilename 由于这只会发生在一个文件上,我如何更改脚本以使该插入发生在目录中的每个文件上?正如nosid所说,您可以使用-I选项就地编辑文件。阅读操

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

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

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

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

for this in foo*.txt; do
  sed -i'' -e 'your-sed-script' "$this"
done
也就是说,我不确定您的insert方法是否能工作,或者至少不能可靠地工作。我在FreeBSD和OSX上进行了测试,但根本不起作用。我插入行的一般策略是使用awk。因此(例如):

这里的awk行搜索/MYWORD/(一个扩展正则表达式,而
sed
默认为基本正则表达式)。如果找到它,它首先打印“额外”文本。然后,“1”计算为“真”,也将打印当前行。其效果是在MYWORD之前的行中插入“额外”文本


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

您是说您的示例代码实际上可以在单个文件上运行吗?
for this in foo*.txt; do
  awk '/MYWORD/{print "Extra line of text goes here."} 1' "$this" > "$this.$$"
  mv "$this.$$" "$this"
done