Найти и заменить символ в XML-файле с помощью команды sed не работает [закрыто]

Я создал ниже сценарий для присоединения файла CSV. Файл генерируется, но его обрезание заголовка / столбца имя CSV неправильно, а также есть еще один файл, который прикрепляется к электронной почте, а именно «ATT0001.txt» с каждым письмом. Что-то не так, что вы могли бы узнать здесь?

SCRIPT

(
echo "From:"$1;
echo "To:"$2;
echo "Subject:"$3;
echo "MIME-Version: 1.0";
echo "Content-Type:multipart/mixed; boundary=\"B835649000072104Jul07\"";

echo "--B835649000072104Jul07";
echo "Content-Type: text/html; charset=\"UTF-8\"";
echo "Content-Transfer-Encoding: 7bit";
echo "Content-Disposition: inline";
echo "";
echo "$4";

echo "--B835649000072104Jul07";
echo "Content-Type: text/csv";
echo "Content-Transfer-Encoding: base64";
echo "Content-Disposition: attachment; filename=\"$5\"";
base64 "$5"

echo "--B835649000072104Jul07";
) | sendmail -t
1
задан 5 October 2015 в 16:21

1 ответ

Вам нужно уйти & amp; по причине особый характер. И для этого нужно два прохода.

Использование: 1. sed 's|Hi\&|Hi\&|g' yourfile.xml. Это даст:

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello & How are you?</d>
</a>
Второй проход будет: sed 's|Hello\ \&| \Hello\ \&amp;|g' test.xml. Производит:
<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
    <c>Hi&amp;Welcome</c>
   </b>
   <d> Hello &amp; How are you?</d>
</a>
Конечно, используйте переключатель -i, чтобы сделать его permenant.

Еще один расширенный способ, основанный на комментарии @terdon ниже:

sed -e 's/Hello &/Hello \&amp;/' -e 's/Hi&/Hi\&amp;/' filename.xml

-1
ответ дан 23 May 2018 в 16:56
  • 1
    Зачем вам два прохода? Нет необходимости в Hi и Hello в регулярном выражении. – Nephente 5 October 2015 в 16:53
  • 2
    @Nechente, вы тоже правы. Существует много способов редактировать файл с помощью sed или perl или python. Почему бы вам не улучшить ответ? Полезно знать другие методы. – Aizuddin Zali 5 October 2015 в 16:55
  • 3
    Вам также не нужно бежать &. Оператор & ins sed s/// означает «все, что было согласовано», поэтому в данном конкретном случае, поскольку OP соответствует &, & в правой части будет фактически &. Нет абсолютно никаких оснований для запуска двух проходов. Фактически, второй проход разбивает первый и приводит к Hi&amp;amp;Welcome. – terdon♦ 5 October 2015 в 16:56
  • 4
    @terdon, проверенный на моей коробке. он не нарушил первый проход. Я пытаюсь быть более основательным для ответа, который легко понять в POSIX. – Aizuddin Zali 5 October 2015 в 16:58
  • 5
    О, извините, мое плохое. Я не понял, что вы использовали Hello &. Нет, он не сломается на втором проходе, это просто не нужно. OP хочет заменить & на &amp;, зачем указывать только два конкретных? Что делать, если в файле есть другие? Кроме того, вам еще не нужны два прохода: sed 's/Hello &/Hello \&amp;/;s/Hi&/Hi\&amp;/ или POSIXLY sed -e 's/Hello &/Hello \&amp;/' -e 's/Hi&/Hi\&amp;/. Однако в обоих случаях вам действительно не нужно избегать пробелов или & по причине, описанной выше. – terdon♦ 5 October 2015 в 17:02

Другие вопросы по тегам:

Похожие вопросы: