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