2015-07-11 3 views
2

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

=Continent 
=Country 
=State 
=City 
=Street 

Теперь у меня есть файл первенствовать, в котором у меня есть текст, который должен заменить эти вхождения - в качестве примера:
= континент следует заменить с = Asia
Аналогично для другого текста

Теперь я думал о написании программы Java, чтобы прочитать мой входной файл, прочитайте файл сопоставления и для каждого поиска вхождений и заменить.
Я ленив здесь - задавался вопросом, могу ли я сделать то же самое с помощью редакторов, таких как VIM? это возможно?
ПРИМЕЧАНИЕ. Я не хочу заменять один текст. У меня есть несколько текстов, которые нужно найти и заменить, и я не хочу выполнять поиск и заменять вручную для каждого.

EDIT1:
Содержание моего файла, который я хочу, чтобы заменить "1.txt"

continent=cont_text 
country=country_text 

Файл, который содержит значения, которые я хочу, чтобы заменить: "to_replace. TXT "

=cont_text~Asia 
=country_text~India 

и, наконец, с помощью„СЭД“вот мой файл .sh - но я делаю что-то неправильно - это не заменяет содержимое «1.txt»

while IFS="~" read foo bar; 
do 
echo $foo 
echo $bar 
for filename in 1.txt; do 
    sed -i.backup 's/$foo/$bar/g;' $filename 
done 
done < to_replace.txt 
+0

Для начала, вы могли бы по крайней мере экспортировать текст из файла Excel в какой-то вменяемый формат CSV (?), Загрузите его в буфер Vim или сохранить его в файл и показать нам образец. Или вы можете сделать проблему еще более сложной, заявив, что ваш файл excel имеет неизвестный пароль и находится на другой машине, с которой вы не можете подключиться: P – VanLaser

+0

:) см. Мое редактирование с полной информацией - tx –

ответ

2

Вы не можете поставить $foo и $bar в одинарные кавычки, так как оболочка не будет расширять их. Вам не нужен цикл for $filename in 1.txt, потому что sed будет проходить через линии 1.txt. И вы не можете использовать -i.backup внутри цикла, потому что он будет каждый раз изменять файл резервной копии и не сохранять оригинал. Так что ваш сценарий должен быть:

#!/bin/bash 
cp 1.txt 1.txt.backup 
while IFS="~" read foo bar; 
do 
    echo $foo 
    echo $bar 
    sed -i "s/$foo/=$bar/g;" 1.txt 
done < to_replace.txt 

Выход:

$ cat 1.txt 
continent=Asia 
country=India 
+0

Спасибо ! это отлично сработало. –

+1

Это не сработает различными способами в зависимости от содержимого ваших входных файлов и содержимого каталога, из которого вы его выполняете. Каждый раз, когда вы пишете цикл в оболочке, чтобы манипулировать текстом, у вас неправильный подход. –

0

СЭД для простых замен на отдельных линиях и оболочки является средой, из которой вызвать инструмент не инструмент для работы с текстом, так какое-то время вам напишите цикл оболочки, чтобы манипулировать текстом, который вы делаете неправильно.

Просто используйте инструмент, который те же самые ребята, которые изобрели SED и оболочки также изобретенный сделать общие задания обработки текста, как это, AWK:

$ awk -F'[=~]' -v OFS="=" 'NR==FNR{map[$2]=$3;next} {$2=map[$2]} 1' to_replace.txt 1.txt 
continent=Asia 
country=India 
0

Эта sed команда будет делать это без какого-либо цикла:

sed -n 's#\(^=[^~]*\)~\(.*\)#s/\1/=\2/g#p' to_replace.txt |sed -i -f- 1.txt 

Или sed с расширенными регулярными выражениями:

sed -nr 's#(^=[^~]*)~(.*)#s/\1/=\2/g#p' to_replace.txt | sed -i -f- 1.txt 

Пояснение:

Команда sed:

sed -n 's#\(^=[^~]*\)~\(.*\)#s/\1/=\2/g#p' to_replace.txt 

генерирует выходной сигнал:

s/=cont_text/=Asia/g 
s/=country_text/=India/g 

, который затем используется в качестве sed сценария для следующего sed после того, как трубы.


$ cat 1.txt 
continent=Asia 
country=India 
Смежные вопросы