한 줄을 파일 내용으로 바꾸고 그 주위의 내용을 일부 텍스트로 바꾸는 방법은 무엇입니까?

한 줄을 파일 내용으로 바꾸고 그 주위의 내용을 일부 텍스트로 바꾸는 방법은 무엇입니까?

VPN 인증서를 하나의 파일로 결합하고 싶습니다. 다음은 템플릿 파일입니다.

# some unrelated stuff 

ca ca.crt

# other unrelated stuff

나는 그 줄을 다음과 같이 바꾸고 싶다 ca ca.crt:

<ca>
# ca.crt contents
</ca>

나는 다음 스크립트를 시도했습니다.

cat client-template.ovpn | 
sed -e 's/ca ca.crt/<ca>\n<\/ca>/' | 
sed -e '/<ca>/r ca.crt'

이 스크립트는 제대로 작동하지만 두 개의 다른 파일을 and와 함께 붙여 넣어야 하는데 and 명령을 함께 결합 ca.crt하는 명령이 있는지 궁금합니다 .sr

나는 이것을 사용하고 있지만 sed다른 Unix 도구에 대한 답변은 환영합니다.

답변1

굿 올드와 함께 ed:

ed -s client-template.ovpn <<\IN
/ca ca.crt/s//<ca>\
<\/ca>/
- r ca.crt
/cert client.crt/s//<cert>\
<\/cert>/
- r client.crt
/key client.key/s//<key>\
<\/key>/
- r client.key
,p
q
IN

이렇게 하면 한 줄이 변경됩니다.

tag tag.extension

도착하다

<tag>
</tag>

그런 다음 ( ) 끝 표시 줄 앞(즉, 교체 후 현재 줄)의 내용을 작성합니다 r. 실제로 변경 사항을 템플릿 파일에 쓰는 것으로 대체됩니다(또는 변경 사항을 다른 파일에 저장하기 위해). 패턴을 찾을 수 없으면 오류가 발생하므로 주의하세요.tag.extension-,pww somefileed

이것을 다음과 결합할 수 있습니다(비슷하지만 패턴 공간에서는 작동하지 않습니다. - 이와는 다릅니다) sed.raars

sed '
/ca ca.crt/{
s//<ca>/
r ca.crt
a\
</ca>
}
/cert client.crt/{
s//<cert>/
r client.crt
a\
</cert>
}
/key client.key/{
s//<key>/
r client.key
a\
</key>
}
' client-template.ovpn

답변2

sedCA 파일 이름에 작은따옴표 문자가 포함되어 있지 않다고 가정하고 GNU를 사용하면 다음과 같이 할 수 있습니다.

sed "s|^ca \(.*\)|echo '<ca>'; cat '\1'; echo '</ca>'|e"

답변3

이 문제에 대해서는 sed를 사용하지 않고 이 스레드에서 언급한 방법을 사용합니다.https://serverfault.com/questions/287688/templated-with-linux-in-a-shell-script

아이디어는 bash 자체를 템플릿 언어로 사용하여 템플릿에 파일을 포함하는 등의 작업을 쉽게 수행할 수 있다는 것입니다.

따라서 템플릿은 파일을 생성하기 위해 실행하는 bash 스크립트가 됩니다. 이것을 문제에 적용하면 다음과 같습니다.

make-client.sh:

#!/bin/bash

cat <<-EOF
# some unrelated stuff

<ca>
$(cat ca.crt)
</ca>

<other>
$(cat other.file)
</other>

# other unrelated stuff
EOF

명령줄에서의 사용법:

$ make-client.sh > client.ovpn

답변4

귀하의 질문을 올바르게 이해했다면 r다음과 같은 D조합을 사용하는 것이 가능할 것 같습니다.

sed '/^ca ca.crt/ {
r new-content-file
D
}' client-template.ovpn

관련 정보