Linux에서 이전 줄에 줄 정렬을 추가하는 방법은 무엇입니까?

Linux에서 이전 줄에 줄 정렬을 추가하는 방법은 무엇입니까?

XML 파일이 많이 있습니다. 로 끝나는 줄이 있습니다 </autoReferenceLines>. 이 줄은 파일마다 선행 공백이 다를 수 있습니다. 해당 줄 아래에 새 줄을 추가하고 모든 파일에서 동일한 선행 공백을 사용하고 싶습니다.

새 행을 추가할 수 있지만 새 행을 이전 행과 동일한 정렬로 만드는 방법을 모르겠습니다.

내가 지금 가지고 있는 것은 이것입니다:

find ${location} -type f -name "*.xml" -path "**/adult/**" -exec sed -i '/<\/autoReferenceLines>/a <ztv>0<\/ztv>' {} +

편집하다:

xml 편집을 위한 몇 가지 도구가 있다는 것을 알았습니다 xmlstarlet. 그러나 제가 생각하는 한 bash 명령을 사용하는 것이 더 좋습니다. 설치할 권한이 없습니다.

특정 줄의 선행 공백을 계산하는 방법이 있나요? 예를 들어, 줄의 선행 공백을 계산합니다.</autoReferenceLines>

편집 2:

입력하다:

  <Parameter> 
    <autoTransfer>Nowhere</autoTransfer>
    <toFilm>0</toFilm>
    <autoReferenceLines>0</autoReferenceLines>
  </Parameter>

버그는 다른 파일에 있고 들여쓰기도 다릅니다. 따라서 행마다 선행 공백이 다릅니다.

예상 출력:

  </Parameter>
    <autoTransfer>Nowhere</autoTransfer>
    <toFilm>0</toFilm>
    <autoReferenceLines>0</autoReferenceLines>
    <ztv>0</ztv>
  </Parameter> 

답변1

Gnu sed를 사용하면 이를 수행할 수 있습니다. 귀하의 find 명령을 사용하고 그것의 sed 부분을 수정했습니다.

$ find ${location} -type f -name "*.xml" -path "*/adult/*" -exec sed -i -e '/<\/autoReferenceLines>/!b' -e 'h;s/\S.*/<ztv>0<\/ztv>/;H;g' {} +

또는 개행을 이스케이프 처리하여 확장하지만 여전히 한 줄로 처리합니다.

$ find ${location} -type f \
   -name "*.xml" -path "*/adult/*" \
   -exec sed -i \
    -e '/<\/autoReferenceLines>/!b' \   
    -e 'h;s/\S.*/<ztv>0<\/ztv>/;H;g' \
   {} +;

피복재:

잘 작성 find하셨고, 편집이 필요한 필수 파일도 선택하셨습니다 sed.

sed 명령은 자동 인용된 문자열이 있는 줄을 찾습니다. h작업을 시작하기 전에 복사본을 저장합니다. 그런 다음 공백이 아닌 첫 번째 줄부터 \S줄 끝까지 모두 삭제합니다. 이제 선행 공백(있는 경우)이 남습니다. 이 작업을 수행할 때 필수 문자열 ztv도 붙여넣습니다. 이제 동일한 수의 선행 공백과 필수 문자열이 생겼습니다.

다음으로 방금 생성한 문자열을 원래 스토리지 라인에 추가 H하고 g이를 패턴 공간에 넣습니다.

-i이 옵션은 gnu sed의 여러 파일과 함께 사용될 때 의미되므로 -s명시적으로 제공하지 않습니다.

답변2

이 명령은 원하는 작업을 수행해야 합니다.

find ${location} -type f -name "*.xml" -path "**/adult/**" -exec grep -q '</autoReferenceLines>' {} \; -exec perl -i"*" -ne 'print; print "$1<ztv>0</ztv>\n" if (m[^(\s*).*</autoReferenceLines>])' {} \;

관련 정보