![값을 해당 값 + 상수로 바꾸는 방법](https://linux55.com/image/117191/%EA%B0%92%EC%9D%84%20%ED%95%B4%EB%8B%B9%20%EA%B0%92%20%2B%20%EC%83%81%EC%88%98%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
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
이것은 더 많은 작업입니다( 그런데 perl
GNU는 이것을 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$num
Bash의 작은 따옴표는 변수 확장을 중지하므로 다음은 대체할 리터럴을 찾고 있습니다 .$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
단일 호출로 모든 교체를 수행합니다 . 가독성을 높이기 위해 이 명령을 여러 줄로 나누고 싶었지만 그럴 수 없었습니다. 그러다가 작동이 멈췄습니다. 그래서 - 한 줄:printf
paste
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
설명하다
sed -i -r "$(
paste -d'/'
- 왼쪽과 오른쪽 부분을 슬래시로 연결합니다. (3,4 단계에서 생성) -/
결과는 다음과 같습니다.s/G1\b/G230/g
<(printf 's/%s\\b\n' G{1..229})
- 대체 명령의 왼쪽 부분을 생성합니다sed
.예:s/G1\b
,s/G2\b
,s/G3\b
, 곧.\b
- 단어 경계와 일치합니다. 즉, 왼쪽 문자가 "단어" 문자이고 오른쪽 문자가 "비단어" 문자인 경우 일치하며 그 반대의 경우도 마찬가지입니다.정보-GNU sed, 정규식 확장.
<(printf '%s/g\n' G{230..458})
- 대체 명령의 올바른 부분을 생성합니다sed
.예:G230/g
,G231/g
,G232/g
, 곧.)" 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;