2017-06-22 6 views
1

指定したファイルを読み込み、特定のテキストを探し、そのセクションを他のテキストに置き換える.shファイルを作成します。シェルスクリプト.SHファイル内の定義セクションを置き換えます。

somefile.jsがあるとします。

シェルスクリプトがこれを見ることができます:

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

、これがすべてで行うことができます

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

でそれを置き換えますか?もしそうなら、どのように?

+0

あなたは何を試してみましたか?私はあなたのためにスクリプト全体を書くことを期待していないと思います。 ;) – Markus

+0

これを行うことができるかどうかだけ知る必要があります。私は、ファイルから指定されたテキストを置き換える方法を尋ねるのではありません。(実行可能であれば) – unzip700

答えて

0

はい、sedを使用して、ファイル内のテキストを置き換えることができます。

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

この小さな例ではold.txtで持つすべてを置き換え、new.txtに結果を出力します。

+0

OPがしようとしていることを行う方法は間違いありません。実際には有効なsed構文でもありません。それでも、それは受け入れられた答えです - あなたが不思議に思う.... –

+0

構文エラーを指摘してくれてありがとう。この特定のケースでは、sedの使用は十分以上でなければなりません。コーナーケースがあるかもしれません。しかし、私の見解からは、OPが、通常はnpmによって自動的に作成されるpackage.json-fileのようなsthを管理したいと考えています。 – Markus

+0

OPは任意の複数行のブロックを他の任意の複数行のブロックに置き換えようとしています - s/old/newはそれを明確にしません(一度に複数の行を読み込む方法を理解する必要があります''古いテキストの '/' sと任意のregexpメタキャラクタ、 ''新しい ''のテキストの中の任意の後方参照)、それをしようとしても間違った出発点です。 –

0

sedは、個々の行で単純な置換の場合、です。すべてです。他には、明快さ、堅牢性、効率などのためにawkを使うべきです。この仕事をするために堅牢なsedスクリプトを思いつくことを考えていくために飛び抜けなければならないフープのいくつかについては、Is it possible to escape regex metacharacters reliably with sedを参照してください。

あなたが欲しいものを行う簡単な、堅牢な方法は、(マルチchar型のRS用のGNUのawkを使用して、この場合には):

$ 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 
関連する問題