텍스트 파일( )이 있습니다 devel.xml
.
temp.txt
문자열을 다른 파일( )의 내용으로 바꾸기 위해 REPLACETHIS라는 단어를 추가했습니다 .
내가 얻은 가장 가까운 것은 다음과 같습니다.
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
문자열 뒤에 내용을 삽입한 다음 문자열을 삭제합니다.
이것이 최선의 방법입니까?
답변1
파일에 나타나는 모든 위치를 삭제하고 SUBSTITUTETHIS
(나머지 줄은 삭제하지 않음) temp.TXT
해당 줄 아래에 콘텐츠를 삽입하는 것뿐입니다. 한 줄에 여러 번 발생하는 경우 SUBSTITUTETHIS
첫 번째 발생만 제거되고 temp.TXT
하나의 복사본만 추가됩니다.
발생 시 전체 행을 바꾸려면 SUBSTITUTETHIS
이 d
명령을 사용하십시오. 두 가지를 동시에 실행해야 하므로 일치하는 항목 r
이 d
있으면 지원 그룹에 넣으세요.
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.txt
ed slurp
(한 번에 모두 읽기)를 $donor_file
변수에 넣습니다. 두 번째 문장에서 :g
부사는 우리에게 대체를 s///
수행하라고 지시합니다. :global
대체 연산자(절반 대체) 오른쪽에 있는 중괄호 $donor_file
로 변수를 묶으면 {…}
보간이 트리거되어 원하는 텍스트가 삽입됩니다.