Intereting Posts
Есть ли какой-либо тип представления в файловой системе для сетевых портов? Как вызвать неактивный RAID-массив mdadm после перезагрузки при добавлении диска на рейд-6? Замена IP-адреса на результат sed: sed: -e выражение # 1, char 57: Непревзойденный (или \ ( Установите туннель IPSEC между двумя Ubuntu 12.04 ПК по локальной сети Выполните команду на новом именованном экране Могу ли я удалить пакеты * -dev, если я не компилирую приложения из исходного кода? Автоматическое завершение терминала OSX bash – нечетное поведение на двойной вкладке notify-send / notification-daemon: отключить значок в трее Карта памяти USB не смонтирована – Не разрешено Как настроить Kerberos authetication в Fedora 19 Сохранение вывода команды в переменной оболочки пространство консоли, съеденное содержимым файла Получить выходной ток Идентификаторы исходных IP-адресов всех входящих пакетов Драйверы AMD делают Linux Mint 17 Cinnamon crash

«While read» также выводит то, что не читается / не редактируется

(Я знаю, что название плохо, так как оно характерно для моего случая)

Я уже давно пытаюсь создать сценарий. Я пробовал много разных методов, но то, что я хочу сделать, это отредактировать 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> 

Просто добавьте условие 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 в скрипте оболочки считается плохой практикой .