Отступы в файле. как?

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
InventoR
ст. лейтенант
Сообщения: 1344
Зарегистрирован: 2006-12-10 19:43:25
Контактная информация:

Отступы в файле. как?

Непрочитанное сообщение InventoR » 2011-11-13 0:09:35

Собственно давно мучает вопрос:
есть файл.

Код: Выделить всё

        <item type="4" key="ifInErrors01" value_type="3">
          <description>ifInErrors01</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>30</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>Bps</units>
          <multiplier>0</multiplier>
          <delta>1</delta>
          <formula>0</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts>localhost</trapper_hosts>
          <snmp_community>public</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.2.2.1.14.1</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <applications/>
        </item>
Как видно в нем много оступов.
Теперь берем файлик:

Код: Выделить всё

#!/bin/bash
while read line
do
echo -e "$line"
done < if
На выхлопе:

Код: Выделить всё

<item type="4" key="ifInErrors01" value_type="3">
<description>ifInErrors01</description>
<ipmi_sensor></ipmi_sensor>
<delay>30</delay>
<history>90</history>
<trends>365</trends>
<status>0</status>
<data_type>0</data_type>
<units>Bps</units>
<multiplier>0</multiplier>
<delta>1</delta>
То есть, весь выхлоп идет с обрезанными отступами в начале оригинального файла, а их хочется сохранить для наглядности, как бы это можно сделать в bash?
ну вот и сказочке конец, кто слушал, тот молодец.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение kpp » 2011-11-13 0:39:35

Перед циклом изменить переменную IFS на что-нить, надо подумать на что лучше или вообще все равно, лишь бы не на пробел и\или символ табуляции.

Код: Выделить всё

tIFS="${IFS}"   # на всякий пожарный сохраняем законное значение переменной
IFS='i'

цикл

IFS="${tIFS}"   # вернуть законное значение переменной
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
InventoR
ст. лейтенант
Сообщения: 1344
Зарегистрирован: 2006-12-10 19:43:25
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение InventoR » 2011-11-13 10:12:24

Код: Выделить всё

while IFS=: read line
do
echo -e "$line"
done < if
Пасибо.
ну вот и сказочке конец, кто слушал, тот молодец.

Bayerische
капитан
Сообщения: 1820
Зарегистрирован: 2010-12-25 20:41:50
Откуда: Хлебная столица

Re: Отступы в файле. как?

Непрочитанное сообщение Bayerische » 2011-11-13 13:25:11

Вот мне интересно, если в файле встретится двойной бэкслэш (\\), как его без искажений обработать?

Аватара пользователя
InventoR
ст. лейтенант
Сообщения: 1344
Зарегистрирован: 2006-12-10 19:43:25
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение InventoR » 2011-11-13 13:30:35

сейчас как раз делаю.
через sed погоняешь в теле цикла:
st=`echo "$line" | sed 's/"/\\\"/g'`
не много извращенно, но работает.
ну вот и сказочке конец, кто слушал, тот молодец.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение kpp » 2011-11-13 14:36:13

гм.. а если в файле одинарные слэши, то

Код: Выделить всё

echo "$line" 
уже их заменит\уберет...
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение kpp » 2011-11-13 14:52:27

Предлагаю такой вариант:

Код: Выделить всё

sed 's/\\/\\\\/g' ${vhod_file} |
while IFS=":" read line
do
 echo "${line}"
done
Работает с любым кол-вом обратных слэшей.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
InventoR
ст. лейтенант
Сообщения: 1344
Зарегистрирован: 2006-12-10 19:43:25
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение InventoR » 2011-11-13 15:11:30

о. интересно. а как можно такое реализовать?

Код: Выделить всё

cat test.txt
${NUM}

Код: Выделить всё

cat test.sh
#!/bin/sh
NUM=20
read v < "test.txt"
echo $v
выводит:

Код: Выделить всё

./test.sh
${NUM}
А хочу чтобы выводило: То есть, текст во внешнем файлы в некоторых местах указываем переменные и при прогоне они замещаются значениями переменных.
ну вот и сказочке конец, кто слушал, тот молодец.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение kpp » 2011-11-13 15:22:46

Код: Выделить всё

read v < "text.txt"
# так
eval v="$v"
# или так
eval echo $v
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
InventoR
ст. лейтенант
Сообщения: 1344
Зарегистрирован: 2006-12-10 19:43:25
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение InventoR » 2011-11-13 15:25:25

супер.
пошел осваивать и изобретать дальше.
пасибки
ну вот и сказочке конец, кто слушал, тот молодец.

Аватара пользователя
InventoR
ст. лейтенант
Сообщения: 1344
Зарегистрирован: 2006-12-10 19:43:25
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение InventoR » 2011-11-13 16:11:55

К сожалению пока не получилось сделать:

Код: Выделить всё

sed 's/\\/\\\\/g' ${vhod_file} |
Но сам скрипт приобрел такой вид:

Код: Выделить всё

#!/bin/bash

FILE=$1
COUNT=$2

for ((i = 1; i <= ${COUNT}; i++)); do
NUM2=$i;

if [ $NUM2 -le 9 ] ; then
    NUM1=0${NUM2}
     else
  NUM1=${NUM2}
fi
    while IFS=: read line
    do
    st=`echo "$line" | sed 's/"/\\\"/g'`
    eval echo -e "\"$st\""
    done < $FILE
done
./script.sh text.txt 2

Это оригинальный файл. В местах которые надо заменить номера значений вписуем ${NUM1} ${NUM2}
Разница в том что NUM1 имеет формат 00, а NUM2 0-9

Код: Выделить всё

        <item type="4" key="ifInErrors${NUM1}" value_type="3">
          <description>ifInErrors${NUM1}</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>30</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>Bps</units>
          <multiplier>0</multiplier>
          <delta>1</delta>
          <formula>0</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts>localhost</trapper_hosts>
          <snmp_community>pub</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.2.2.1.14.${NUM2}</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <applications/>
        </item>
Выхлоп:

Код: Выделить всё

        <item type="4" key="ifInErrors01" value_type="3">
          <description>ifInErrors01</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>30</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>Bps</units>
          <multiplier>0</multiplier>
          <delta>1</delta>
          <formula>0</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts>localhost</trapper_hosts>
          <snmp_community>priv</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.2.2.1.14.1</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <applications/>
        </item>
        <item type="4" key="ifInErrors02" value_type="3">
          <description>ifInErrors02</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>30</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>Bps</units>
          <multiplier>0</multiplier>
          <delta>1</delta>
          <formula>0</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts>localhost</trapper_hosts>
          <snmp_community>priv</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.2.2.1.14.2</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <applications/>
        </item>

Теперь это можно подставить в xml шаблон zabbix и действовать дальше.
В обще хочется конечно полностью допилить по максимуму генерацию шаблонов по параметрам.
ну вот и сказочке конец, кто слушал, тот молодец.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение kpp » 2011-11-13 16:21:08

Не уразумел смысла строки:

Код: Выделить всё

st=`echo "$line" | sed 's/"/\\\"/g'`
, а именно

Код: Выделить всё

sed 's/"/\\\"/g'
Двойную кавычку заменяем на \" ?
Зачем?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
InventoR
ст. лейтенант
Сообщения: 1344
Зарегистрирован: 2006-12-10 19:43:25
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение InventoR » 2011-11-13 16:50:04

когда мы потом делаем:
eval echo -e "\"$st\""

до выхлоп получается совсем без ковычек. echo их сьедает.
по этому три подрят \\\ правят ситуацию.
ну вот и сказочке конец, кто слушал, тот молодец.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Отступы в файле. как?

Непрочитанное сообщение kpp » 2011-11-13 17:01:54

А, точно :pardon:
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.