Sed 조건부 교체가 파일에서 읽습니다.

Sed 조건부 교체가 파일에서 읽습니다.

다음 내용을 포함하는 atana1 및 atana2라는 두 개의 파일이 있습니다.

$ cat atana1 :

location
allow 127.0.0.1;
deny all;


$ cat atana2
27.0.12.12

=> sed를 통해 문자열 27.0.12.12 => 127.0.0.1과 atana2 파일의 입력 조건을 바꾸고 싶습니다.

나는 명령을 시도하고 있습니다 :

sed '/127.0.0.1/r atana2' atana1

산출:

location
allow 127.0.0.1;
27.0.12.12
deny all;

== >> 내 의도는 atana2 라인에서 조건을 읽고 sed 명령을 통해 문자열 127.0.0.1을 바꾸는 것입니다.

원하는 출력:

location
allow 27.0.12.12;
deny all;

그것을 사용하지 않고:

sed -i 's/127.0.0.1/27.0.12.12/g' file.txt

답변1

이렇게 하면 안 되는 이유:

replace="$(cat atana2)"

sed "s|127.0.0.1|$replace|" atana1

작은따옴표를 큰따옴표로 바꾸면 sed변수 확장이 발생합니다.

산출:

location
allow 27.0.12.12;
deny all;

원하는 것이 무엇인지 확신했다면 다음을 수행하세요.

sed -i "s|127.0.0.1|$replace|" atana1

이 경우에는 아무런 영향을 미치지 않지만 127102031해당 문자열이 대체하려는 항목 앞에 오면 해당 문자열이 .모든 문자로 확장되므로 해당 문자열도 대체됩니다. 나중에 유사한 파일이 있으면 다음 예와 같이 특정 줄에서 해당 파일을 바꾸십시오.

location
allow 127.0.0.1; allow 127102031;
deny all;
127102031 127102031

암호:

sed "2s|127.0.0.1|$replace|" atana1

그러면 두 번째 줄의 첫 번째 항목이 대체됩니다.

산출:

location
allow 27.0.12.12; allow 127102031;
deny all;
127102031 127102031

다음 예와 같은 여러 인스턴스:

location
allow 127.0.0.1; allow 127102031;
deny all;
127102031 127102031

두 번째 줄이 두 번째로 나타납니다.

sed "2s|127.0.0.1|$replace|2" atana1

산출:

location
allow 127.0.0.1; allow 27.0.12.12;
deny all;
127102031 127102031

이 경우에도 문제 없이 처음에 사용했던 것을 사용할 수 있지만 이는 나중에 참조용일 뿐이며 파일이 다를 수 있습니다.

답변2

awk 명령을 사용해보십시오

i=`cat `

awk -v i="$i" '{gsub("127.0.0.1",i,$0);print }'  atana1

산출

location
allow 27.0.12.12;
deny all;

관련 정보