Unix脚本替换多个文件中的字符串,并以其他名称保存

Unix脚本替换多个文件中的字符串,并以其他名称保存,unix,batch-file,sed,replace,Unix,Batch File,Sed,Replace,我正在尝试构建一个使用sed执行以下操作的脚本: 在当前目录及其下搜索以.config结尾的文件,即:test.js.config。 用另一个字符串替换字符串,即:{TEST}->50 将结果保存在一个新文件中,该文件末尾没有.config文件ex:test.js 删除原始的.config文件ie:test.js.config 如果它能够使用另一个包含要搜索的字符串的文件来替换字符串,那就太好了,比如字典: {TEST}=50 {FIRST_NAME}=Alex 您可以将一组sed s///命令

我正在尝试构建一个使用sed执行以下操作的脚本:

在当前目录及其下搜索以.config结尾的文件,即:test.js.config。 用另一个字符串替换字符串,即:{TEST}->50 将结果保存在一个新文件中,该文件末尾没有.config文件ex:test.js 删除原始的.config文件ie:test.js.config 如果它能够使用另一个包含要搜索的字符串的文件来替换字符串,那就太好了,比如字典:

{TEST}=50

{FIRST_NAME}=Alex


您可以将一组sed s///命令放在一个文件中:

$ cat change.sed 
s/{TEST}/50/g
s/{FIRST_NAME}/Alex/g
如果您有以下配置输入: $cat test.js.config 警报{TEST} 警报{FIRST_NAME}

结果将是:

$ sed -f change.sed test.js.config > test.js
$ cat test.js
alert(50)
alert(Alex)
语法不是很好,但也不可怕:

OTOH,如果您真的想在替换文件中使用括号语法

$ cat test.js.config 
alert({TEST})
alert({FIRST_NAME})
。。。替换文件中的键值对

$ cat change.txt 
TEST=50
FIRST_NAME=Alex
…您可以编写一个sed命令来更改sed替换中的键值对

$ sed 's#\(.*\)=\(.*\)#s/{\1}/\2/g#' change.txt
s/{TEST}/50/g
s/{FIRST_NAME}/Alex/g
…并在实际替换中使用此命令:

$ sed "$(sed 's#\(.*\)=\(.*\)#s/{\1}/\2/g#' change.txt)" test.js.config > test.js
$ cat test.js
alert(50)
alert(Alex)

您可以将一组sed s///命令放在一个文件中:

$ cat change.sed 
s/{TEST}/50/g
s/{FIRST_NAME}/Alex/g
如果您有以下配置输入: $cat test.js.config 警报{TEST} 警报{FIRST_NAME}

结果将是:

$ sed -f change.sed test.js.config > test.js
$ cat test.js
alert(50)
alert(Alex)
语法不是很好,但也不可怕:

OTOH,如果您真的想在替换文件中使用括号语法

$ cat test.js.config 
alert({TEST})
alert({FIRST_NAME})
。。。替换文件中的键值对

$ cat change.txt 
TEST=50
FIRST_NAME=Alex
…您可以编写一个sed命令来更改sed替换中的键值对

$ sed 's#\(.*\)=\(.*\)#s/{\1}/\2/g#' change.txt
s/{TEST}/50/g
s/{FIRST_NAME}/Alex/g
…并在实际替换中使用此命令:

$ sed "$(sed 's#\(.*\)=\(.*\)#s/{\1}/\2/g#' change.txt)" test.js.config > test.js
$ cat test.js
alert(50)
alert(Alex)

我是否可以让shell脚本自己计算出原始名称和新名称?我的意思是,检测带有和不带.config扩展名的名称,而不必手动输入我想要转换的每个文件名?另外,如果可能的话,删除结尾的.config文件。@Frederic:如果name是foo.config,那么${name%.config}就是foo。Try:ls | grep\.config$|同时读取名称;执行echo$name${name%.config};done@FredericHutow当然对于*.config中的f;是否执行sed$sed's\.\=\.\s/{\1}/\2/g'change.txt$f>${f/.config/}&&rm$fdone@FredericHutow:如果你想进入子目录,你可以找到grep“.config$”|同时读取f;你知道吗…我能让shell脚本自己计算出原始名称和新名称吗?我的意思是,检测带有和不带.config扩展名的名称,而不必手动输入我想要转换的每个文件名?另外,如果可能的话,删除结尾的.config文件。@Frederic:如果name是foo.config,那么${name%.config}就是foo。Try:ls | grep\.config$|同时读取名称;执行echo$name${name%.config};done@FredericHutow当然对于*.config中的f;是否执行sed$sed's\.\=\.\s/{\1}/\2/g'change.txt$f>${f/.config/}&&rm$fdone@FredericHutow:如果你想进入子目录,你可以找到grep“.config$”|同时读取f;做