sed를 사용하여 특정 줄 앞에 일부 줄을 삽입하세요.

sed를 사용하여 특정 줄 앞에 일부 줄을 삽입하세요.

다음 파일이 있습니다

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/opentype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/truetype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/type1</dir>
</fontconfig>

다음 줄을 추가해야 했습니다.

  <dir>/usr/local/texlive/texmf-local</dir>
  <dir>/usr/local/share/fonts</dir>

닫는 태그 앞에 /fontconfig>가 있습니다. 항상 일곱 번째 줄에 있는지 확실하지 않으므로 문자열로 찾아야 합니다. <> 및 /와 관련된 문자열에 문제가 있습니다... sed로 어떻게 해결할 수 있나요? 감사해요

답변1

sedXML/HMTL 데이터를 구문 분석하는 데 , 등을 사용하지 마십시오 awk. 강력하고 확장 가능한 결과가 생성되지 않습니다. 적절한 XML/HTML 프로세서를 사용하십시오.
올바른 방법은 다음과 같이 하는 것입니다.xmlstarlet도구:

xmlstarlet ed -s '//fontconfig' -t elem -n 'dir' -v '/usr/local/texlive/texmf-local' \
-s '//fontconfig' -t elem -n 'dir' -v '/usr/local/share/fonts' input.xml

산출:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/opentype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/truetype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/type1</dir>
  <dir>/usr/local/texlive/texmf-local</dir>
  <dir>/usr/local/share/fonts</dir>
</fontconfig>

파일 수정/편집제자리에- 추가된 -L옵션:xmlstarlet ed -L ....


자세한 내용을 보려면 다음을 입력하세요.xmlstarlet ed --help

답변2

/#다른 구분 기호 를 사용하여 패턴 텍스트의 문제를 극복할 수 있습니다.

sed '\#^</fontconfig>#i\
  <dir>/usr/local/texlive/texmf-local</dir>\
  <dir>/usr/local/share/fonts</dir>
' file
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/opentype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/truetype</dir>
  <dir>/usr/local/texlive/2017/texmf-dist/fonts/type1</dir>
  <dir>/usr/local/texlive/texmf-local</dir>
  <dir>/usr/local/share/fonts</dir>
</fontconfig>

관련 정보