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>])' {} \;