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

时间:2015-03-06 23:56:21

标签: macos shell sed terminal

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

我想编写一个shell脚本来执行此操作,这样我就可以避免在SublimeText中一次搜索一个关键字(其中有很多)。不幸的是,我的shell-fu并不那么强大。

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

S /富/ prefix_foo /克
S /酒吧/ prefix_bar /克
S /巴兹/ prefix_baz /克

它建议用于此列表的终端命令是:

sed -f replace.sed < old.txt > new.txt

我能够通过设置以下脚本来替换文件中的实例(而不是创建新文件),我称之为inline.sh:

#!/bin/sh -e
in=${1?No input file specified}
mv $in ${bak=.$in.bak}
shift
"$@" < $bak > $in

总而言之,我最终得到了这个命令:

~/inline.sh old.txt sed -f replace.sed

我尝试了这个并且它适用于一次一个文件。我如何调整它以搜索和替换整个目录中的所有文件?

2 个答案:

答案 0 :(得分:2)

for f in *; do
  [[ -f "$f" ]] && ~/inline.sh "$f" sed -f ~/replace.sed
done

答案 1 :(得分:1)

在剧本中:

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

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

当然,这将使原件保持原样。