2つの$記号の間にある文字列を別の文字列に置き換える

2つの$記号の間にある文字列を別の文字列に置き換える

このような内容のファイルがあります。

hello , welcome
name is $foo$
bye bye

こうして$foo$交換したいです。bar

hello , welcome
name is bar
bye bye

図のように周囲のドル記号も削除したいです。

私は次のことを試してきました。

sed -i 's/$.*$/$foo$/g’

答え1

その間のすべての項目と$それ以降の次の項目を置き換えるには、次のようにします。$bar

sed 's/\$[^$]*\$/bar/g' < file

$トピックの終わりに一致する特殊正規表現演算子です。リテラル文字を一致させるには、代わりにまたはを$使用する必要があります。\$[$]

sを明示的に変更します$token$

sed '
  s/\$foo\$/bar/g
  s/\$abc\$/xyz/g
' < file

perl大きなリストの場合は、次のことをお勧めします。

perl -p -e '
  BEGIN {
    %map = qw(
      $foo$ bar
      $abc$ xyz
      $xyz$ abc
    );
    $regexp = join "|", map {qr{\Q$_\E}} keys %map;
  }
  s/$regexp/$map{$&}/g' < file

厳密に言うと、基本正規表現( の基本正規表現;一部の実装では、一部、、、、、sed...を使用して別のスタイルに切り替える)の場合は、パターンの終わりまたはaの前(もっと多くの場合)にのみ適用されます。多くは、BREの特別サポート拡張です。したがって、上記では最後の項目だけを脱出するだけです。それでも必ずしも必要でないときに脱出しても何の害もなく、特殊なケースを覚えているよりも簡単です。-E-r-R-P-X-A$\)$

関連情報