Я хочу выполнить несколько операций поиска и замены над текстом. У меня есть файл CSV UTF-8, содержащий то, что найти (в первом столбце) и чем его заменить (во втором столбце), упорядоченный от самого длинного до самого короткого.
например:.
orange,fruit2
carrot,vegetable1
apple,fruit3
pear,fruit4
ink,item1
table,item2
Оригинальный файл:
"I like to eat apples and carrots"
Результирующий выходной файл:
"I like to eat fruit3s and vegetable1s."
Тем не менее, я хочу убедиться, что если одна часть текста уже была заменена, то это не мешает тексту, который уже был заменен. Другими словами, я не хочу, чтобы это выглядело так (оно соответствует «таблице» из vegetable1):
"I like to eat fruit3s and vegeitem21s."
В настоящее время я использую этот метод, который довольно медленный, потому что я должен сделать весь поиск и заменить дважды:
(1) Преобразовать CSV в три файла, например ::
a.csv b.csv c.csv
orange 0001 fruit2
carrot 0002 vegetable1
apple 0003 fruit3
pear 0004 fruit4
ink 0005 item1
table 0006 item 2
(2) Затем замените все элементы из a.csv
в file.txt
на соответствующий столбец в b.csv
, используя ZZZ
вокруг слов, чтобы убедиться, что позже не будет ошибок при сопоставлении чисел:
a=1
b=`wc -l < ./a.csv`
while [ $a -le $b ]
do
for i in `sed -n "$a"p ./b.csv`; do
for j in `sed -n "$a"p ./a.csv`; do
sed -i "s/$i/ZZZ$j\ZZZ/g" ./file.txt
echo "Instances of '"$i"' replaced with '"ZZZ$j\ZZZ"' ("$a"/"$b")."
a=`expr $a + 1`
done
done
done
(3) Затем снова запустите этот же скрипт, но замените ZZZ0001ZZZ
на fruit2
из c.csv
.
Выполнение первой замены занимает около 2 часов, но поскольку я должен выполнить этот код дважды, чтобы избежать редактирования уже замененных элементов, это занимает вдвое больше времени. Есть ли более эффективный способ выполнить поиск и замену, который не выполняет замены для уже замененного текста?