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

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

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

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

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

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

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



답변

당신이 한 일은 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


답변