sed를 사용하여 문자열을 파일 내용으로 대체

sed를 사용하여 문자열을 파일 내용으로 대체

두 개의 다른 파일이 있습니다.

파일 1

/home/user1/  
/home/user2/bin  
/home/user1/a/b/c

파일 2

<TEXT1>
<TEXT2>

<TEXT1>나는 바꾸고 싶다파일 2내용이 있는파일 1사용 sed. 이 명령을 시도했지만 올바른 출력을 얻지 못했습니다.

cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"

다른 도구를 사용하여 이 문제를 해결할 수도 있습니다.

답변1

다음은 sed 스크립트 솔루션입니다(명령줄에서 한 줄에 입력하는 것보다 보기 쉽습니다).

/<TEXT1>/ {
  r File1
  d
}

실행하세요:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>

답변2

var 대체를 사용하여 솔루션을 찾는 데 오랜 시간이 걸렸습니다. 모든 sed 솔루션은 전체 줄을 삭제하거나 잘못 교체하기 때문에 작동하지 않습니다.

FILE2=$(<file2)
FILE1=$(<file1)
echo "${FILE2//TEXT1/$FILE1}" 

file2의 모든 TEXT1 항목을 file1의 내용으로 바꿉니다. 다른 모든 텍스트는 변경되지 않습니다.

답변3

diff어떤 경우에는 / patch메소드가 흥미로울 수 있기 때문에 대답하는 것입니다 . 정의 파일에 포함된 행을 사용 중인 행 blob1으로 바꾸려면 다음을 수행하십시오.blob2

diff -u blob1 blob2 > patch-file

예를 들어 blob1다음이 포함된 경우:

hello
you

다음 blob2을 포함합니다:

be
welcome
here

생성되는 내용은 patch-file다음과 같습니다.

--- blob1   2011-09-08 16:42:24.000000000 +0200
+++ blob2   2011-09-08 16:50:48.000000000 +0200
@@ -1,2 +1,3 @@
-hello
-you
+be
+welcome
+here

이제 이 패치를 다른 파일에 적용할 수 있습니다.

patch somefile patch-file

, 행을 , 의 행 hello으로 대체합니다 .youbewelcomeheresomefile

관련 정보