sed를 사용하여 문자열을 파일 내용으로 바꿉니다.


23

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

파일 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구현을 사용하고 있는지 알려주십시오 . 당신은 코드가 GNU와 함께 작동합니다 sed.
manatwork

죄송합니다. 오류가 없습니다. 원하는 출력을 얻지 못했습니다. 출력은 같습니다 /home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>. 새로운 줄을 얻지 못했습니다.
chanchal1987

이것이 특정 경우에 적용되는지 확실하지 않지만 with diffpatch도구를 사용하면 파일의 일부 줄을 다른 줄로 쉽게 바꿀 수 있습니다.
Stéphane Gimenez

1
Btw, $()sed 스크립트에서 수집 한 임의의 데이터를 사용 하면 눈이 번집니다. 일부 문자가 특별한 의미로 해석되는 장소에서는 외부 데이터를 사용 하지 마십시오 .
Stéphane Gimenez

답변:


24

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

/<TEXT1>/ {
  r File1
  d
}

그것을 실행 :

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

고마워요. 그러나 다른 스크립트 파일을 사용하고 싶지 않습니다. 인라인 솔루션이 있습니까?
chanchal1987

물론 : sed '/<TEXT1>/{rFile1^Md^M}' File2"^ M"은 return을 누르는 것입니다. 문제는 sed가 r과 d 명령을 구분하기 위해 {...} 안에 개행 문자가 실제로 필요하다는 것입니다.
Kusalananda

6
배쉬으로, POSIX 스타일의 문자열은 조금 청소기입니다 :sed $'/<TEXT1>/ {r File1\n d}'
글렌 잭맨

9
또한와 -e 한 라이너 :sed -e '/<TEXT1>/{r File1' -e 'd}' File2
sdaau

1
그리고을 포함하는 전체 줄을 바꾸는 대신 <TEXT1>문자열 자체를 바꾸고 나머지 줄은 그대로 두려면 어떻게해야합니까? Text1: <TEXT1>Text1: <file_contents>.
Robin Winslow

9

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

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

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


아주 좋아요 아마도보다 더 빨리 sed, 너무 (교체 일명) 그 "확장은"(쉘에 내장되어 있기 때문에 bash적어도)
부드러운 노란색

7

어떤 경우에는 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.


이것은 정말 영리하지만 스크립트에서 자동화 할 수 있다면 더 좋을 것입니다
qodeninja
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.