문자열을 명령 출력으로 바꾸는 방법은 무엇입니까?

문자열을 명령 출력으로 바꾸는 방법은 무엇입니까?

hostname -i내가 실행 하여 다음과 같은 결과를 얻었다 고 가정해 보겠습니다 .

root@linux:/# hostname -i
192.168.1.1
root@linux:/#

출력(IP 주소만)을 파이핑하여 특정 파일의 특정 문자열을 어떻게 바꿀 수 있습니까?

이 명령의 출력 (예: sedOR 사용 )을 다음 부분으로 파이프하고 싶습니다.awkmy_server_ip

"server":"my_server_ip",
"server_port":8388,

답변1

"server"특정 문자열이 아닌 후행 따옴표에 있는 내용을 변경하고 싶은 것 같습니다. my_server_ip그렇다면 sed를 사용하세요.

$ sed 's/\("server":"\)[^"]*/\1'"$(hostname -i)"'/' file
"server":"<the host name>",
"server_port":8388,

또는 awk( hostname -i출력에 역참조 메타문자나 sed 구분 기호가 포함될 수 있으면 더 강력하지만, 그렇지 않아야 합니다):

$ awk -v h="$(hostname -i)" 'BEGIN{FS=OFS="\""} $2=="server"{$4=h} 1' file
"server":"<the host name>",
"server_port":8388,

답변2

다음과 같은 대체 매개변수를 사용할 수 있습니다.sed -i -e "s/my_server_ip/$(hostname -i)/" txt

답변3

GNU sed를 사용하는 경우 /ecommand 에서 해당 플래그를 사용할 수 있지만 s/실행되는 명령은 전체 줄입니다.

#!/bin/sed -f
/my_server_ip/{
s//%s/
s/.*/printf '&' $(hostname -i)/e
}

이렇게 하면 다음과 같은 명령줄이 생성 printf '"server":"%s",' $(hostname -i)되고 실행되어 관련 줄이 대체됩니다.

답변4

m=$(hostname -i)
sed -i "s/my_server_ip/$m/g" filename
"server":"192.168.1.1",
"server_port":8388,

관련 정보