다음 내용을 포함하는 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;