sed를 사용하여 문자열을 파일 내용으로 바꿉니다. 1 /home/user1/ /home/user2/bin /home/user1/a/b/c 파일 2 <TEXT1> <TEXT2> 나는 대체 할 <TEXT1>의 있는 File2을

두 가지 다른 파일이 있습니다.

파일 1

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

파일 2

<TEXT1>
<TEXT2>

나는 대체 할 <TEXT1>있는 File2을 의 내용 을 File1가 사용 sed. 이 명령을 시도했지만 적절한 출력을 얻지 못했습니다.

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

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



답변

sed 스크립트 솔루션은 다음과 같습니다 (명령 줄에서 한 줄로 가져 오는 것보다 눈에 더 쉽습니다).

/<TEXT1>/ {
  r File1
  d
}

그것을 실행 :

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


답변

var replacement를 사용 하여이 솔루션을 찾는 데 오랜 시간이 걸렸습니다. 모든 sed 솔루션은 완전한 라인을 삭제하거나 잘못 교체하므로 나에게 적합하지 않았습니다.

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

file2의 모든 TEXT1 발생을 file1의 내용으로 바꿉니다. 다른 모든 텍스트는 그대로 유지됩니다.


답변

어떤 경우에는 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, you에 의해 선 be, welcome, here라인을 somefile.


답변