"읽는 동안"은 읽거나 편집되지 않은 내용도 출력합니다.

"읽는 동안"은 읽거나 편집되지 않은 내용도 출력합니다.

내가 원하는 것은 xml 파일을 편집하고 태그 중 하나의 내용을 바꾸는 것입니다. 이것은 내 스크립트입니다.

while read line; do
if [[ "$line" == *"<Valuec=\"0\">"* ]]
then 
~/bin/nn4 Decrypt1 "$line" | sed 's/^/\<Valuec=\"0\"\>/g;s/$/\<\/Valuec\>/g'
fi
done <"$1"

nn4태그를 제거하고 콘텐츠의 암호를 해독한 다음 sed태그를 다시 제자리에 배치하도록 명령합니다.

이것은 입력입니다

<string>
    <Id>1</Id>
    <file>file.txt</file>
    <Valuec="0">982498as9adhfsdf</Valuec>
</string>
<string>
    <Id>2</Id>
    <strStringCaption>file2.txt</strStringCaption>
    <Valuec="0">2389aHASDasd</Valuec>
</string>

그러나 물론 이렇게 하면 편집된 줄만 출력됩니다. 다음과 같습니다.

<Valuec="0">decryptedstring</Valuec>
<Valuec="0">decryptedstring2</Valuec>

그러나 나는 다음과 같이 보이기를 원합니다.

<string>
    <Id>1</Id>
    <file>file.txt</file>
    <Valuec="0">decryptedstring</Valuec>
</string>
<string>
    <Id>2</Id>
    <strStringCaption>file2.txt</strStringCaption>
    <Valuec="0">decryptedstring2</Valuec>
</string>

답변1

else루프 본문 내부에 조건을 추가하기만 하면 됩니다 while.

while IFS= read -r line; do
if [[ "$line" == *"<Valuec=\"0\">"* ]]
then 
  ~/bin/nn4 Decrypt1 "$line" | sed 's/^/\<Valuec=\"0\"\>/g;s/$/\<\/Valuec\>/g'
else
  printf '%s\n' "$line"
fi
done <"$1"

사용에 주의하세요IFS= read -r전체 읽기철사.

그럼에도 불구하고 이 작업에는 다른 도구를 사용하는 것을 고려해야 합니다.쉘 스크립트에서 while 루프를 사용하는 것은 나쁜 습관으로 간주됩니다..

관련 정보