sed-문자열을 파일 내용으로 바꿉니다.


22

두 개의 파일이 있습니다 : 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
확실하지 않지만 cat file1 | sed -e 's/localhost/1.1.1.1/g'작동합니까?
dchirikov

1
상기 봐 \r나오지 명령.
Kevin

답변:


14

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"

4
일에 대한 awk. 나는 상상 sed 이다 이 할 수있는,하지만 몹시 서투른 될 것입니다. 이곳이 awk빛납니다!
HalosGhost

1
@ HalosGhost : 그것은 둘 다 같고 OP 질문을 오해 한 것 같습니다. 나는 대답을 업데이트했습니다.
cuonglm

sed파일에 공백이나 glob 문자가 포함 된 경우 솔루션의 대체 명령을 큰 따옴표로 묶어야합니다.
Graeme

@Graeme : 감사합니다! 자유롭게 편집하십시오.
cuonglm

2
당신은 모두를 탈출해야 /하고 &대체에. 즉,의"$(sed 's:[/\\&]:\\&:g' file2)"
토비 Speight

6

사용하기 전에 쉘 명령 대체를 사용하여 대체 문자열로 파일을 읽을 수 있습니다 sed. 따라서 sed정상적인 대체물 만 볼 수 있습니다.

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


18
여러 줄로 된 파일과 특수 문자가있는 파일에서 작동합니까?
Trevor Hickey 2016 년

9
@TrevorHickey는 그렇지 않습니다. Sed는 "unsminated`s 'command"오류와 함께 실패합니다.
DarioP

1

사용해보십시오

join file1 file2

그런 다음 원치 않는 필드를 제거하십시오.


1

나는 또한 오늘 "문제"를 가졌다 : 텍스트 블록을 다른 파일의 내용으로 바꾸는 방법.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.