파일의 패턴을 다른 파일의 내용으로 바꾸기

파일의 패턴을 다른 파일의 내용으로 바꾸기

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

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

내가 얻은 가장 가까운 것은 다음과 같습니다.

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

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

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

답변1

파일에 나타나는 모든 위치를 삭제하고 SUBSTITUTETHIS(나머지 줄은 삭제하지 않음) temp.TXT해당 줄 아래에 콘텐츠를 삽입하는 것뿐입니다. 한 줄에 여러 번 발생하는 경우 SUBSTITUTETHIS첫 번째 발생만 제거되고 temp.TXT하나의 복사본만 추가됩니다.

발생 시 전체 행을 바꾸려면 SUBSTITUTETHISd명령을 사용하십시오. 두 가지를 동시에 실행해야 하므로 일치하는 항목 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

아니면 펄을 사용하세요. 이는 짧지만 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

답변2

sed 's/<\!--insert \(.*\.html\) content here-->/&/;s//\ncat "\1"/e'

또는 @KlaxSmashing을 통해 더 깨끗하고 (제 생각에는) 더 효과적인 개선이 있을 수 있습니다.

sed 's/<\!--insert \(.*\.html\) content here-->/\ncat "\1"/e'

이것은 HTML 부분을 다른 HTML 파일에 삽입하기 위해 제가 만든 한 줄 템플릿 시스템입니다. 패턴으로 파일 이름을 지정할 수 있습니다. 그런 다음 패턴은 패턴에 지정된 파일 이름의 내용으로 대체됩니다.

예를 들어 <!--insert somehtmlfile.html content here-->줄 이 somehtmlfile.html. &등의 문자를 특별히 처리 하지 않아도 잘 작동하는 것 같습니다 \.

$ cat first.html
first line of first.html
second line of first.html

$ cat second.html
this is second.html
\ slashes /
and ampersand &
and ! exclamation point
end content from second.html

$ cat file\ name\ space.html
the file containing this content has spaces in the name
and it still works with no escaping.

$ cat input
<!--insert first.html content here-->
input line 1
<!--insert first.html content here-->
input line 2
<!--insert second.html content here-->
input line 3
<!--insert file name space.html content here-->

$ sed 's/<\!--insert \(.*\.html\) content here-->/&/;s//\ncat "\1"/e' input
first line of first.html
second line of first.html
input line 1
first line of first.html
second line of first.html
input line 2
this is second.html
\ slashes /
and ampersand &
and ! exclamation point
end content from second.html
input line 3
the file containing this content has spaces in the name
and it still works with no escaping.

$

답변3

사용행복하다(이전 Perl_6)

~$ raku -pe 'BEGIN my $donor_file = "donor_file.txt".IO.slurp;   \
             s:g/REPLACETHIS/{$donor_file}/;'  recipient_file.txt

이 Raku 답변은 익숙한 s///대체 관용구를 사용하고 -pe자동 인쇄(sed와 유사한) 플래그를 사용합니다.

첫 번째 명령문에서는 donor_file.txted slurp(한 번에 모두 읽기)를 $donor_file변수에 넣습니다. 두 번째 문장에서 :g부사는 우리에게 대체를 s///수행하라고 지시합니다. :global대체 연산자(절반 대체) 오른쪽에 있는 중괄호 $donor_file로 변수를 묶으면 {…}보간이 트리거되어 원하는 텍스트가 삽입됩니다.

https://raku.org

관련 정보