파일 내의 패턴을 다른 파일의 내용으로 대체


20

텍스트 파일 ( devel.xml)이 있습니다.

이 문자열을 다른 파일 ( temp.txt) 내의 내용으로 바꾸려면 REPLACETHIS라는 단어를 추가했습니다 .

내가 가진 가장 가까운 것은 이것입니다 :

sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;

문자열 뒤에 내용을 삽입 한 다음 문자열을 삭제합니다.

이것이 최선의 방법입니까?


sed를해야합니까? temp.txt에 얼마나 많은 텍스트가 있는지에 따라 perl 솔루션으로 올라갈 수 있습니다.
user17591

답변:


34

당신이 한 일은 SUBSTITUTETHIS파일에서 파일이 나타나는 곳 을 제거 하고 (파일의 나머지 줄은 아님) temp.TXT해당 줄 아래 의 내용을 삽입하는 것 입니다. 경우 SUBSTITUTETHIS라인에 여러 번 나타날 첫 번째 발생을 제거하고, 단지 하나의 카피가 temp.TXT부가된다.

SUBSTITUTETHIS나타날 때 전체 줄을 바꾸려면 d명령을 사용하십시오 . 당신은 모두를 실행해야하기 때문에 rd일치있을 때, 브레이스 그룹에 넣어.

sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt

일부 sed 구현에서는 세미콜론을 사용하여 명령을 구분하고 중괄호 주위에서 구분 기호를 모두 생략하지만 여전히 r명령에 대한 인수를 종료하려면 줄 바꿈이 필요합니다 .

sed -e '/SUBSTITUTETHIS/ {r temp.TXT
                          d}' -i devel.txt

SUBSTITUTETHIS파일의 내용 으로 바꾸고 싶지만 줄 앞뒤에 나오는 내용을 유지하려면 더 복잡합니다. 가장 간단한 방법은 sed 명령에 파일 내용을 포함시키는 것입니다. 내용을 올바르게 인용해야합니다.

sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt

또는 Perl을 사용하십시오. 짧지 만 cat각 대체마다 한 번씩 실행됩니다 .

perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt

스크립트가 시작될 때 파일을 한 번 읽고 쉘 명령에 의존하지 않으려면 다음을 수행하십시오.

perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

(가독성을 위해 두 줄로 표시되었지만 줄 바꿈을 생략 할 수 있습니다). 파일 이름이 변수 인 경우 인용 문제를 피하려면 환경 변수를 통해 스크립트에 전달하십시오.

replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

내가 대신 cat temp.txt할 수 있도록 perl 명령을 어떻게 변경할 수 cat ${variable}있습니까?
마리아 이네스 파르 니 사리

@MariaInesParnisari 댓글 형식이 잘못되었습니다. 약간 다른 더 강력한 솔루션으로 내 대답을보십시오.
Gilles 'SO- 악마 그만

File :: Slurp가 항상 설치되는 것은 아니기 때문에 -0777전체 파일에서 스위치를 사용하여 스위치를 사용하는 것이 좋습니다 open.perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
mivk

r temp.TXT"BEGIN temp.TXT", "END temp.TXX"
kyb

내 질문에 대한 해결책을 찾았습니다. a(추가) 명령을 사용하십시오 . grymoire.com/Unix/Sed.html#uh-36
kyb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.