값을 해당 값 + 상수로 바꾸는 방법

값을 해당 값 + 상수로 바꾸는 방법

G1에서 G229까지의 변수가 포함된 파일이 있습니다. G230에서 G469로 교체하고 싶습니다. 어떻게 해야 합니까? 이 bash 스크립트를 시도했지만 작동하지 않습니다.

#!/bin/bash

for num in {1..229}
  do
  echo G$num
  N=$(($num+229))
  echo G$N  
  sed -i -e 's/$G$num/$G$N/g' file
done

답변1

이것은 더 많은 작업입니다( 그런데 perlGNU는 이것을 sed복사했습니다 ):-i

perl -pi -e 's{\$G\K\d+}{
  if ($& >= 1 && $& <= 229) {
    $& + 229
  } else {
    $&
  }}ge' file

또한 G0001으로 변경됩니다 G230. 이를 원하지 않으면 \d+으로 변경할 수 있습니다 [1-9]\d*.

귀하의 접근 방식을 사용하면 참조를 수정하더라도 파일을 229번 다시 작성하게 되고 원하는 대로 작동하지 않게 됩니다.

A 는 s/\$G1/\$G230/g로 변경되고 $G12, $G2302다음 것은 s/\$G2/\$G231/g으로 변경됩니다 G231302( s/\$G23/\$G252로 변경되는 식 G2521302으로 계속됩니다).

답변2

$G$numBash의 작은 따옴표는 변수 확장을 중지하므로 다음은 대체할 리터럴을 찾고 있습니다 .$G$N

sed -i -e 's/$G$num/$G$N/g' file

Bash 확장을 원하므로 큰따옴표를 사용하고 특수 문자를 수동으로 이스케이프 처리해야 합니다.

sed -i -e "s/\$G$num/\$G$N/g" file

다음 스크립트를 통해 차이점을 확인할 수 있습니다.

#!/bin/bash

for num in {1..229}; do
  N=$(($num+229))
  echo '$G$num $G$N' vs "\$G$num \$G$N"
done

생산

$G$num $G$N vs $G1 $G230
$G$num $G$N vs $G2 $G231
$G$num $G$N vs $G3 $G232
...
$G$num $G$N vs $G228 $G457
$G$num $G$N vs $G229 $G458

답변3

sed해결책. 아마도 이것은 너무 까다롭고 이상적이지 않을 수도 있지만 작동합니다. 실험으로 :).

에서 생성된 하나의 큰 명령 시퀀스를 실행하여 sed단일 호출로 모든 교체를 수행합니다 . 가독성을 높이기 위해 이 명령을 여러 줄로 나누고 싶었지만 그럴 수 없었습니다. 그러다가 작동이 멈췄습니다. 그래서 - 한 줄:printfpaste

sed -i -r "$(paste -d'/' <(printf 's/%s\\b\n' G{1..229}) <(printf '%s/g\n' G{230..458}))" file.txt

다음 명령으로 변환됩니다 sed.

sed -i -r "s/G1\b/G230/g
s/G2\b/G231/g
s/G3\b/G232/g
s/G4\b/G233/g    
...
s/G227\b/G456/g
s/G228\b/G457/g
s/G229\b/G458/g" file.txt

설명하다

  1. sed -i -r "$(
  2. paste -d'/'- 왼쪽과 오른쪽 부분을 슬래시로 연결합니다. (3,4 단계에서 생성) - /결과는 다음과 같습니다.s/G1\b/G230/g
  3. <(printf 's/%s\\b\n' G{1..229})- 대체 명령의 왼쪽 부분을 생성합니다 sed.예: s/G1\b, s/G2\b, s/G3\b, 곧.
    • \b- 단어 경계와 일치합니다. 즉, 왼쪽 문자가 "단어" 문자이고 오른쪽 문자가 "비단어" 문자인 경우 일치하며 그 반대의 경우도 마찬가지입니다.정보-GNU sed, 정규식 확장.
  4. <(printf '%s/g\n' G{230..458})- 대체 명령의 올바른 부분을 생성합니다 sed.예: G230/g, G231/g, G232/g, 곧.
  5. )" file.txt- 입력 파일.

시험

입력하다

var G1 = value;
G3 = G1 + G2; 
G3 = G1 + G2
G3 = ${G1} + G2
var G2 = value;
var G3 = value;
G224 = G3 + G215;
G124 = G124 + G215;
G124 = G124 + G12;
var G4 = value;
var G5 = value;
var G6 = value;
var G59 = value;
var G60 = value;
var G156 = value;
var G227 = value;
var G228 = value;
var G229 = value;

산출

var G230 = value;
G232 = G230 + G231;
G232 = G230 + G231
G232 = ${G230} + G231
var G231 = value;
var G232 = value;
G453 = G232 + G444;
G353 = G353 + G444;
G353 = G353 + G241;
var G233 = value;
var G234 = value;
var G235 = value;
var G288 = value;
var G289 = value;
var G385 = value;
var G456 = value;
var G457 = value;
var G458 = value;

관련 정보