두 개의 $ 기호 사이에 있는 문자열을 다른 문자열로 교체

두 개의 $ 기호 사이에 있는 문자열을 다른 문자열로 교체

이런 내용의 파일이 있습니다.

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$\)$

관련 정보