1

正規表現の後の行の一部を変更するにはどうすればよいですか?

その中の行を(その場で)変更する必要があるファイルがありますが、その中の行name =の後に来るものだけcluster {です。ファイルは次のようになります。

cluster {
  name = "Some _ Name"
  owner = "Cavendish Laboratory"
  .....
  .....
}
module {
    name = "core_metrics"
}
service {
    name = "ssh_check"
}
......
......

次のように、この 2 つのタスクを個別に実行できます。

sed -n '/cluster\ {/{n;p;}'               # next line after cluster
sed -ic "/name\ =\ /{s:OLD:NEW:g}"        # replace OLD with NEW on the fly

しかし、その2つを組み合わせて次のような最終結果を得るにはどうすればよいですか?

cluster {
  name = "Worker Nodes"
  owner = "Cavendish Laboratory"
  .....
  .....
}

それ、どうやったら出来るの?乾杯!

4

3 に答える 3

1

これはあなたのために働くかもしれません:

old="Some _ Name" new="Worker Nodes"

sed '/cluster {/,/}/s/name = "'"$old"'"/name = "'"$new"'"/' file
cluster {
  name = "Worker Nodes"
  owner = "Cavendish Laboratory"
  .....
  .....
}
module {
    name = "core_metrics"
}
    service {
    name = "ssh_check"
}
......
......
  • cluster {との間の行に注目して}ください。/cluster {/,/}/
  • 代用new_old s/name = "'"$old"'"/name = "'"$new"'"/
于 2012-05-18T13:36:43.787 に答える
1

Perl のワンライナーは次のとおりです。

perl -ple 'do {$_ =~ s/name = .*/name = "Worker Nodes"/; $flag = 0} if $flag; $flag = 1 if $_ =~ /cluster/' inputfile
于 2012-05-18T22:00:49.613 に答える
1

これを「言葉で」行う方法は次のとおりです。

1) 各行を読む

2)線がパターンマッチするたびにcluster {、ブール変数を設定しますwasClusterLine = true

3) 次の行でwasClusterLinetrue の場合name =、現在の行で正規表現の置換を行います

4)wasClusterLine = falseの直後の行で正規表現の置換のみを行いたいため、 set cluster {

それが役立つことを願っています! これは、上で説明したことを実行する perlscript です。

厳密に使用します。
私の $wasClusterLine = 0;
while(<STDIN>) {
        $_; むしゃむしゃ食べます。

        if($wasClusterLine == 1) {
                $_ =~ s/name = .*/name = "ワーカー ノード"/g;
        }
        $wasClusterLine = 0;

        if($_ =~ /cluster/) {
                $wasClusterLine = 1;
        }

        print "$_\n";
}
于 2012-05-18T13:21:36.340 に答える