sed для обработки OFX, извлечения получателя из <MEMO> и печати на <NAME>
Я обрабатываю файл OFX (банковские операции). Мой банк не использует <NAME>
тег для указания получателя, но эта информация является подстрокой <MEMO>
тег.
Итак, мой файл что-то вроде:
...ofx headers and other stuff
...line below is a transaction
<STMTTRN>
<TRNTYPE>OTHER</TRNTYPE>
<DTPOSTED>20160609120000</DTPOSTED>
<TRNAMT>-4.00</TRNAMT>
<FITID>2016060914000</FITID>
<CHECKNUM>000000700132</CHECKNUM>
<REFNUM>700.132</REFNUM>
<MEMO>Credit Card Payment - 09/06 18:37 Walmart 2th street</MEMO>
</STMTTRN>
...continues other transactions and end of file
Я хотел бы соответствовать каждому <MEMO>
тег, извлеките имя получателя (Walmart 2th street
в этом примере) и напишите новую строку с <NAME>
, Мой вывод будет выглядеть так:
...ofx headers and other stuff
...line below is a transaction
<STMTTRN>
<TRNTYPE>OTHER</TRNTYPE>
<DTPOSTED>20160609120000</DTPOSTED>
<TRNAMT>-4.00</TRNAMT>
<FITID>2016060914000</FITID>
<CHECKNUM>000000700132</CHECKNUM>
<REFNUM>700.132</REFNUM>
<MEMO>Credit Card Payment - 09/06 18:37 Walmart 2th street</MEMO>
<NAME>Walmart 2th street</NAME>
</STMTTRN>
...continues other transactions and end of file
Другим инструментом, таким как awk, может быть решение.
2 ответа
Решение
С GNU sed:
sed -r 's/.*<MEMO>.* [0-9]{2}:[0-9]{2} (.*)<.*/&\n <NAME>\1<\/NAME>/' file
Выход:
<STMTTRN>
<TRNTYPE>OTHER</TRNTYPE>
<DTPOSTED>20160609120000</DTPOSTED>
<TRNAMT>-4.00</TRNAMT>
<FITID>2016060914000</FITID>
<CHECKNUM>000000700132</CHECKNUM>
<REFNUM>700.132</REFNUM>
<MEMO>Credit Card Payment - 09/06 18:37 Walmart 2th street</MEMO>
<NAME>Walmart 2th street</NAME>
</STMTTRN>
Если вы хотите редактировать свой файл "на месте", используйте опцию sed -i
,
Дополняю ответ @Cyrus, чтобы иметь дело с ascii-символами:
Я разочаровался в non ascii chars и теперь он работает:
iconv -f "windows-1252" -t "UTF-8" file-ansi.ofx -o file-utf8.ofx
rm file-ansi.ofx
sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚüÜçÇ/aAaAaAaAeEeEiIoOoOoOuUuUcC/' -i file-utf8.ofx
sed -i -r 's/.*<MEMO>.* [0-9]{2}:[0-9]{2} (.*)<.*/&\n <NAME>\1<\/NAME>/' file-utf8.ofx
Мой вывод:
<MEMO>Cartao de Credito - 09/06 18:37 Walmart 2th</MEMO>
<NAME>Walmart 2th street</NAME>