sed - 문자열을 파일 내용으로 교체

sed - 문자열을 파일 내용으로 교체

두 개의 파일이 있습니다: file1file2.

file1다음과 같은 내용이 있습니다.

---
  host: "localhost"
  port: 3000
  reporter_type: "zookeeper"
  zk_hosts: 
    - "localhost:2181"

file2IP 주소 포함( 1.1.1.1)

내가하고 싶은 것은 최종 결과가 다음 localhost과 같도록 바꾸는 것입니다.1.1.1.1

---
  host: "1.1.1.1"
  port: 3000
  reporter_type: "zookeeper"
  zk_hosts: 
    - "1.1.1.1:2181"

나는 시도했다:

sed -i -e "/localhost/r file2" -e "/localhost/d" file1
sed '/localhost/r file2' file1 |sed '/localhost/d'
sed -e '/localhost/r file2' -e "s///" file1

하지만 전체 라인을 교체하거나 수정해야 하는 라인 다음 라인으로 IP를 이동해야 합니다.

답변1

해결책 은 다음과 같습니다 sed.

% sed -e "s/localhost/$(sed 's:/:\\/:g' file2)/" file1
---
  host: "1.1.1.1"
  port: 3000
  reporter_type: "zookeeper"
  zk_hosts: 
    - "1.1.1.1:2181"

sed -i이를 적절히 변경하려면 이를 사용해야 합니다 .

사용할 수 있는 경우 awk방법은 다음과 같습니다 .

% awk 'BEGIN{getline l < "file2"}/localhost/{gsub("localhost",l)}1' file1
---
  host: "1.1.1.1"
  port: 3000
  reporter_type: "zookeeper"
  zk_hosts: 
    - "1.1.1.1:2181"

답변2

sed쉘 명령 대체를 사용하여 대체 문자열이 포함된 파일을 사용하기 전에 읽을 수 있습니다. 따라서 sed일반적인 교체가 표시됩니다.

sed "s/localhost/$(cat file2)/" file1 > changed.txt

답변3

나는 또한 오늘 이 "문제"에 직면했습니다: 텍스트 블록을 다른 파일의 콘텐츠로 바꾸는 방법.

저는 스크립트에서 재사용할 수 있는 bash 함수를 만들어 이 문제를 해결했습니다.

[cent@pcmk-1 tmp]$ cat the_function.sh
# This function reads text from stdin, and substitutes a *BLOCK* with the contents from a FILE, and outputs to stdout
# The BLOCK is indicated with BLOCK_StartRegexp and BLOCK_EndRegexp
#
# Usage:
#    seq 100 110 | substitute_BLOCK_with_FILEcontents '^102' '^104' /tmp/FileWithContents > /tmp/result.txt
function substitute_BLOCK_with_FILEcontents {
  local BLOCK_StartRegexp="${1}"
  local BLOCK_EndRegexp="${2}"
  local FILE="${3}"
  sed -e "/${BLOCK_EndRegexp}/a ___tmpMark___" -e "/${BLOCK_StartRegexp}/,/${BLOCK_EndRegexp}/d" | sed -e "/___tmpMark___/r ${FILE}" -e '/___tmpMark___/d'
}

[cent@pcmk-1 tmp]$
[cent@pcmk-1 tmp]$
[cent@pcmk-1 tmp]$ cat /tmp/FileWithContents
We have deleted everyhing between lines 102 and 104 and
replaced with this text, which was read from a file
[cent@pcmk-1 tmp]$
[cent@pcmk-1 tmp]$
[cent@pcmk-1 tmp]$ source the_function.sh
[cent@pcmk-1 tmp]$ seq 100 110 | substitute_BLOCK_with_FILEcontents '^102' '^104' /tmp/FileWithContents > /tmp/result.txt
[cent@pcmk-1 tmp]$
[cent@pcmk-1 tmp]$
[cent@pcmk-1 tmp]$ cat /tmp/result.txt
100
101
We have deleted everyhing between lines 102 and 104 and
replaced with this text, which was read from a file
105
106
107
108
109
110

답변4

사용해 보세요

join file1 file2

그런 다음 불필요한 필드를 삭제합니다.

관련 정보