2

多くの行を含むファイルがあります。そのうちの2つは次のとおりです。

videoId: 'S2Rgr6yuuXQ'

var vid_seq=1;

シェル スクリプトには 2 つの変数があります。id の値は常に 11 文字/数字です。

id='fsafsferii2'

id_seq=80

これらの 2 行を id と id_seq で変更したい

videoId: 'fsafsferii2'

var vid_seq=80;

使った

sed -i 's/\(videoId: \).*\\1'${id}'/\2' file

しかし、エラーがあります。スクリプトの何が問題なのですか?

ありがとう

4

2 に答える 2

3

このgrepコマンドはテキストを「置換」しません。これは「グローバル正規表現の印刷」用です。しかし、sedはそうします。

sed -i'' '/^videoId: /s/: .*/: '"$id"'/;/^var vid_seq=/s/=.*/='"$id_seq"';/'

私は、このように sed スクリプトに変数を挿入することはあまり好きではありませんが、sed は単純であり、実際の変数を実際に単独で使用するためのメカニズムを提供していません。これを行う場合は、この sed スクリプトを実行する前に、2 つの変数のフォーマット チェックを含めて、必要なデータが含まれていることを確認してください。変数に臨時/記号があると、sed スクリプトが失敗します。

コメントごとに更新:

成功したテストは次のとおりです。

$ id=fsafsferii2
$ id_seq=80
$ cat inp686

videoId: 'S2Rgr6yuuXQ'

var vid_seq=1;

$ sed '/^videoId: /s/: .*/: '"$id"'/;/^var vid_seq=/s/=.*/='"$id_seq"';/' < inp686

videoId: fsafsferii2

var vid_seq=80;

$ 

もちろん、一重引用符を videoId に入れるには、引用符のマジックを実行する必要がありますが、それは自分で理解できるはずです。

更新 2

sed の man ページによると、代替コマンドの形式は次のとおりです。

     [2addr]s/regular expression/replacement/flags

これ[2addr]は、一致する行番号または正規表現である「アドレス」を 2 つまで指定できることを意味します。したがって、s(substitute) コマンドは、行、範囲、一致、または一致間のスパンを取ることができます。この場合、単一の一致を使用して、置換を実行する行を識別しています。

上記のスクリプトは、セミコロンで区切られた 2 つの sed コマンドで構成されています。

  • /^videoId: /videoId:-- ... という単語で始まる一致行
    • s/: .*/: '"$id"'/;-- コロンから行末までのすべてのテキストを、$id環境変数にあるものに置き換えます。
  • /^var vid_seq=/-- 上記のように ... まあ、一致する行。
    • s/=.*/='"$id_seq"';/-- 等号のすべてのテキストを に置き換えます$id_seq

この'"$id"'構造は、一重引用符をて、すぐに変数の展開のために二重引用符を入力することを意味することに注意してください...その後、二重引用符を出て、新しい一重引用符のセットに戻ります。Sed スクリプトは、シェルによって解釈される可能性のある文字が頻繁に使用されるため、一重引用符内で最も安全です。

また、sed の代替コマンドはスラッシュを区切り文字として使用するため、変数$id$id_seq変数にスラッシュが含まれていない場合があることに注意してください。可能であれば、別の区切り文字に切り替えることができます。

于 2012-11-08T12:33:28.167 に答える