Чтение из файла с разделителями символов и назначение в переменные | кш Unix-оболочка

Я использую кш.

Мне нужно прочитать данные из файла в переменные, а затем использовать их для отправки электронных писем.

  • Файл может быть разделен любыми редко используемыми символами (такими как | ^ и т. д.) или группой символов.
  • Необходимо получить письмо от, письмо к, копия, скрытая копия, тема, тело из файла.
  • Я загружаю файл из таблицы, поэтому разделителем может быть любой символ, но он реже используется в общем английском языке, потому что такие символы, как , & * и т. д., могут присутствовать в теле и могут возвращать неправильное значение.

Файл: (cc и bcc недоступны в файле, т. е. пусты)

[email protected]|[email protected]|||TEST EMAIL FOR LMS ERROR|Hi <<FIRST_NAME>>, <br><br>

Following errors are generated during migration of LMS data into FIMS application.<br><br><br>
The respective details of Error(s) occured is logged into the attached file.
Regards,<br>
FIMS Web Application<br><br><br>

This is an auto-generated e-mail, please don't reply to this e-mail
Reply to the following person for further details:
[email protected]

Использование кода:

while IFS='|' read -r a1 a2 a3 a4 a5 a6
do 
flag1=`echo $a1`
flag2=`echo $a2`
flag3=`echo $a3`
flag4=`echo $a4`
flag5=`echo $a5`
flag6=`echo $a6`
done < $RUNTIME/EMAIL_$System`date +%y%m%d`.csv

Это не установка переменных.

И при использовании кода ниже: он показывает нежелательный результат:

while IFS='|' read -r a1 a2 a3 a4 a5 a6
do 
echo $a1
echo $a2
echo $a3
echo $a4
echo $a5
echo $a6
done < $RUNTIME/EMAIL_$System`date +%y%m%d`.csv

Вывод: (чертово много пустых строк)

[email protected]
[email protected]


TEST EMAIL FOR LMS ERROR
Hi <<FIRST_NAME>>, <br><br>






Following errors are generated during migration of LMS data into FIMS application.<br><br><br>





The respective details of Error(s) occured is logged into the attached file.





Regards,<br>





FIMS Web Application<br><br><br>











This is an auto-generated e-mail, please don't reply to this e-mail





Reply to the following person for further details:





[email protected]

person Sachin    schedule 21.01.2015    source источник
comment
Разве вам не нужно просто разобрать первую строку?   -  person SMA    schedule 21.01.2015
comment
Это не одна линия. Вместо этого это только одна единственная запись. И проблема в том, что последней записью является BODY электронного письма, которое действительно содержит много строк.   -  person Sachin    schedule 21.01.2015
comment
Может быть, использовать cut для назначения каждой переменной? cut -f1 -d '|' с помощью f1–f6?   -  person Jmoreland91    schedule 21.01.2015


Ответы (2)


В ksh последняя команда в конвейере выполняется в текущей оболочке.

Я бы обработал первую строку, а затем добавил бы все остальные строки в переменную body.

file="$RUNTIME/EMAIL_$System$(date +%y%m%d).csv"
sed 1q "$file" | IFS="|" read -r from to cc bcc subj body
body="$body
$(sed 1d "$file")"

printf "%s: %s\n" from "$from" to "$to" cc "$cc" bcc "$bcc" subj "$subj" body "$body"
from: [email protected]
to: [email protected]
cc:
bcc:
subj: TEST EMAIL FOR LMS ERROR
body: Hi <<FIRST_NAME>>, <br><br>

Following errors are generated during migration of LMS data into FIMS application.<br><br><br>
The respective details of Error(s) occured is logged into the attached file.
Regards,<br>
FIMS Web Application<br><br><br>

This is an auto-generated e-mail, please don't reply to this e-mail
Reply to the following person for further details:
[email protected]

Иногда мне нравится использовать sed вместо head/tail

person glenn jackman    schedule 21.01.2015
comment
Единственная проблема только в ТЕЛЕ, и вот она пришла снова. Все остальные поля отображаются нормально, но для тела отображается эта ошибка generate_error_file.ksh[174]: body+=$\n: not found .. PS: я новичок в оболочке, поэтому не так много знаю об этом. - person Sachin; 21.01.2015
comment
Кроме того, я обнаружил, что альтернативное решение заключается в том, чтобы спулировать BODY отдельно в другой файл, а затем использовать его. В любом случае я буду использовать этот файл непосредственно как тело в команде mailx. - person Sachin; 21.01.2015
comment
У вас может быть более старый ksh. Я обновил способ добавления текста к переменной body - person glenn jackman; 21.01.2015

Я использовал команду cut, и, похоже, она хорошо работала, назначая их переменным. Хотя я не уверен, что в вашем файле будет несколько записей.

Тестирование.sh

#!/usr/bin/ksh

a1=$(cat test.txt | cut -f1 -d '|' -s)
a2=$(cat test.txt | cut -f2 -d '|' -s)
a3=$(cat test.txt | cut -f3 -d '|' -s)
a4=$(cat test.txt | cut -f4 -d '|' -s)
a5=$(cat test.txt | cut -f5 -d '|' -s)
a6=$(cat test.txt | cut -f6 -d '|')

echo $a1
echo $a2
echo $a3
echo $a4
echo $a5
echo $a6

test.txt

[email protected]|[email protected]|||TEST EMAIL FOR LMS ERROR|Hi <<FIRST_NAME>>, <br><br>

Following errors are generated during migration of LMS data into FIMS application.<br><br><br>
The respective details of Error(s) occured is logged into the attached file.
Regards,<br>
FIMS Web Application<br><br><br>

This is an auto-generated e-mail, please don't reply to this e-mail
Reply to the following person for further details:
[email protected]

вывод:

$Testing.sh
[email protected]
[email protected]


TEST EMAIL FOR LMS ERROR
Hi <<FIRST_NAME>>, <br><br> Following errors are generated during migration of LMS data into FIMS application.<br><br><br> The respective details of Error(s) occured is logged into the attached file. Regards,<br> FIMS Web Application<br><br><br> This is an auto-generated e-mail, please don't reply to this e-mail Reply to the following person for further details: [email protected]
person Jmoreland91    schedule 21.01.2015