Неожиданная замена для & с sed - PullRequest
2 голосов
/ 01 июня 2011

У меня есть файл CSV, содержащий некоторые специальные символы и имена их сущностей HTML

ex: htm.csv

À,À
Á,Á
Â,Â
Ã,Ã
É,É
Ê,Ê
Í,Í
Ó,Ó
Ô,Ô
Õ,Õ

, и у меня есть ряд файлов .php, где этиперсонажи присутствуют.Я написал сценарий оболочки

#!/bin/bash
IFS=","
while read orig html
do
   for fl in *.php; do
   mv $fl $fl.old
   sed 's/'$orig'/'$html'/g' $fl.old > $fl
   done
done< "htm.csv"

, но проблема в том, что при использовании содержимого $html он печатает содержимое $orig вместо "&".

Ответы [ 3 ]

5 голосов
/ 01 июня 2011

& - это специальный символ, означающий «всю совпавшую строку» в команде s///.Используйте \&.

1 голос
/ 11 октября 2017

Используйте любой символ в качестве разделителя команд, вот пример:

sed -Ei "s|$k|$j|g" filename.txt
0 голосов
/ 01 июня 2011

В дополнение к специальным символам вы также можете сделать команды немного безопаснее и короче:

  • Нет необходимости в mv, если ваш sed поддерживает -i (замена на месте)
  • Чтобы избежать установки IFS для остальных команд, вы можете ограничить область действия
  • Побег & в $html

Результат:

#!/bin/bash
while IFS="," read orig html
do
    for fl in *.php
    do
        sed -i 's/'$orig'/'${html//&/\\&}'/g' "$fl"
    done
done < "htm.csv"

Пожалуйста, добавьте пример, если он не работает для вас. Могут быть и другие специальные символы, которые нужно экранировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...