Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
Macos 编写一个shell脚本,替换多个文件中的多个字符串_Macos_Shell_Sed_Terminal - Fatal编程技术网

Macos 编写一个shell脚本,替换多个文件中的多个字符串

Macos 编写一个shell脚本,替换多个文件中的多个字符串,macos,shell,sed,terminal,Macos,Shell,Sed,Terminal,我需要在目录中的许多文件中搜索关键字列表,并为所有关键字添加前缀。例如,如果我的目录中的各种文件包含术语foo、bar和baz,我需要将这些术语的所有实例更改为:前缀foo、前缀bar和前缀baz 我想写一个shell脚本来实现这一点,这样我就可以避免在SublimiteText中一次搜索一个关键字(有很多关键字)。不幸的是,我的贝福没有那么强壮 到目前为止,根据建议,我创建了一个名为“replace.sed”的文件,其中所有术语的格式如下: s/foo/前缀_foo/g s/bar/前缀_ba

我需要在目录中的许多文件中搜索关键字列表,并为所有关键字添加前缀。例如,如果我的目录中的各种文件包含术语foobarbaz,我需要将这些术语的所有实例更改为:前缀foo前缀bar前缀baz

我想写一个shell脚本来实现这一点,这样我就可以避免在SublimiteText中一次搜索一个关键字(有很多关键字)。不幸的是,我的贝福没有那么强壮

到目前为止,根据建议,我创建了一个名为“replace.sed”的文件,其中所有术语的格式如下:

s/foo/前缀_foo/g
s/bar/前缀_bar/g
s/baz/前缀_baz/g

建议与此列表一起使用的终端命令是:

sed -f replace.sed < old.txt > new.txt
我试过了,一次一个文件。如何调整此选项以搜索和替换整个目录中的所有文件?

在脚本中:

#!/bin/bash
files=`ls -1 your_directory | egrep keyword`

for i in ${files[@]}; do
    cp ${i} prefix_${i}
done

当然,这将使原件留在原处

…此外,您在扩展时使用了数组语法(由于缺少引号,这是错误的),但实际上并没有将
文件
定义为数组(这就是为什么添加引号而不修复
文件
实际定义为数组的方式将破坏一切)。
文件=(您的\u目录/*关键字*)
将是数组赋值的等价物,顺便说一句,此后“${files[@]}”中i的
;不使用cp“$i”前缀“$i”;完成
${i}中的大括号
这里对正确性没有任何影响——在这个特定的用例中可以使用它们,也可以不使用它们——但是缺少引号实际上对文件名有害,这些文件名也可以被解释为glob表达式,或者在IFS中包含字符。运行脚本并修复它标记的问题——我的答案对文件名是安全的单独使用空格等,但您的
inline.sh
目前在这方面并不安全。现在,我如何使其递归?@unifactor,bash的哪个版本?如果是4.0或更高版本,
shopt-s globstar
,然后在**/*
中对f使用
…如果是更早的版本,则
查找-键入f-exec~/inline.sh'{}'sed-f~/replace.sed';'
for f in *; do
  [[ -f "$f" ]] && ~/inline.sh "$f" sed -f ~/replace.sed
done
#!/bin/bash
files=`ls -1 your_directory | egrep keyword`

for i in ${files[@]}; do
    cp ${i} prefix_${i}
done
for f in *; do
  [[ -f "$f" ]] && ~/inline.sh "$f" sed -f ~/replace.sed
done