마커 사이에 텍스트 파일의 일부를 다른 텍스트 파일로 바꾸는 방법은 무엇입니까?


26

다음과 같은 텍스트 파일이 있다고 가정 해보십시오.

# custom content section
a
b

### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT

GENERATED CONTENT태그 사이의 부분 을 다른 파일의 내용 으로 바꾸고 싶습니다 .

가장 간단한 방법은 무엇입니까?

답변:


36
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
        }; /$tail/p; d }"  existing_file

우수한. sed그냥 그 이상을 할 수 있습니다 s/.../...!
DevSolar

흠 나를 위해 작동하지 않습니다, sed 명령을 한 줄에 넣어야합니까?
lzap

3
r insert_file명령은 행의 마지막 일이 될해야합니다. 참고 공백이나 의견이 모두 뒤에 허용됩니다. 이 코드는 옵션을 활성화 한 상태에서 GNU sed를 사용하여 테스트 --posix되었으며 예상대로 작동하므로 posix호환sed 됩니다.
Peter.O

1
거룩한 몰리, 멋지다! 이것은 내 sed 사전에 가고 있습니다! 매우 유용하고 아름답습니다. 고맙습니다!
DanielSmedegaardBuus

2
내부 편집을 위해서는 sed (예 :)의 출력을 캡처 output=$(sed -e "..." existing_file)한 다음 두 번째 단계 (예 echo "$output" > existing_file:)로 교체를 수행하여 읽고있는 파일로 리디렉션하려고하면 내용을 읽기 전에 잘립니다.
Chris Tonkinson

5
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file

좋은 작업. 내 것보다 훨씬 간단합니다. :)
키티 박사

4

경고 : 이것이 가장 간단한 방법은 아닙니다. (편집 : bash가 작동하고 POSIX grep도 좋습니다)

기본 텍스트가 "main"파일에 있고 생성 된 컨텐츠가 "gen"파일에 있으면 다음을 수행 할 수 있습니다.

#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main

이 작동합니까? 나는 당신의 마지막 줄이 main고양이가 읽기 전에 그것을 쓰기 위해 열어 줄 것이라고 생각합니다 .
chepner

@ chepner Crap, 당신이 맞아요. 나머지는 작동합니다. 내가 고칠 게
키티 박사

3
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF

heredoc 및 ed 라인 편집기 사용 heredoc 내부의 첫 번째 줄은 '#'BEGIN gENERATED ... '뒤의'd '줄과'- ''### END GENERATED ... '앞의 줄'd '를 삭제하는 것입니다. ### END가 생성 줄 뒤에 FILE2를 삽입하는 것입니다 ... '
Jetchisel

죄송합니다. '### BEGIN GENERATED ..'줄 뒤에 FILE2를 삽입했습니다.
Jetchisel

나에게 쉽게 가져 가라. 그것은 나의 처음으로 끝났다 :-). 또한 나는 같은 단어를 사용했지만 다른 솔루션은 heredocs를 사용하지 않고 printf와 파이프를 사용합니다. 내가 실수했다면 어떤 식 으로든 사과 :-)
Jetchisel

정말 고마워요! Btw-대신 다른 스크립트에서 읽으 r FILE2라고 말할 수 있습니다 r !command.
코스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.