2017-06-22 84 views
1

我期待创建一个.sh文件,它将在其中读取指定的文件,查找特定文本并用其他文本替换该部分。Shell脚本.SH替换文件中的定义部分

假设我们有somefile.js。

一个shell脚本可以看看这个:

"scripts": [ 
    "../node_modules/something.js" 
], 

"scripts": [ 
    "../node_modules/something1.js", 
    "../node_modules/something2.js" 
], 

取代它可以这样可言呢?如果是这样如何?

+0

你尝试过什么?我猜你不希望我们为你写出整个剧本。 ;) – Markus

+0

我只需要知道这是否可以完成。我不是要求scipt只是从文件中替换指定文本的方式(如果可以的话) – unzip700

回答

0

是的,您可以使用sed替换文件中的文本。

sed '/s/one/two/' <old.txt> new.txt 

该小例子取代所有一个与在old.txt并将结果在new.txt输出。

+0

这绝对不是如何做OP所要做的事情,实际上它甚至不是有效的sed语法。然而,这是公认的答案 - 让你想知道...... –

+0

感谢您指出语法错误。对于这个特定情况,使用sed应该足够了。可能会有角落案例。但是从我的观点来看,使用的例子表明OP想要像package.json文件那样管理某些文件,这些文件通常是由npm自动创建的,因此不会涉及很多变体。 – Markus

+0

OP正试图用另一个任意的多行块代替任意多行块 - s/old/new显然不会这样做(你需要弄清楚如何一次读多行,然后处理旧文本中的'/'s和任何正则表达式metachars以及'new'文本'中的任何反向引用),并且甚至尝试这样做都是错误的出发点。 –

0

sed用于简单替换个别行,。对于其他任何事情,你都应该使用awk来提高清晰度,健壮性,效率等等。请参阅Is it possible to escape regex metacharacters reliably with sed了解一些你必须跳过的环节,甚至开始考虑想出一个强大的sed脚本来完成这项工作。

简单,可靠的方法做你想做的(在这种情况下使用GNU AWK多焦RS):

$ cat tst.awk 
BEGIN { RS="^$"; ORS="" } 
ARGIND==1 { old=$0; next } 
ARGIND==2 { new=$0; next } 
s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) } 
{ print } 

$ cat old 
"scripts": [ 
    "../node_modules/something.js" 
], 

$ cat new 
"scripts": [ 
    "../node_modules/something1.js", 
    "../node_modules/something2.js" 
], 

$ cat file 
foo 
"scripts": [ 
    "../node_modules/something.js" 
], 
bar 

$ awk -f tst.awk old new file 
foo 
"scripts": [ 
    "../node_modules/something1.js", 
    "../node_modules/something2.js" 
], 
bar