Найти заменить, используя значения в другом файле
У меня есть каталог файлов, myFiles/
и текстовый файл values.txt
в котором один столбец представляет собой набор значений для поиска, а второй столбец представляет собой соответствующее значение замены.
Цель состоит в том, чтобы заменить все экземпляры значений поиска (первый столбец values.txt
) с соответствующими значениями замены (второй столбец values.txt
) во всех файлах, расположенных в myFiles/
,
Например...
values.txt
:
Привет пока
Счастливый грустный
Выполнение команды заменит все экземпляры "Hello" на "Goodbye" в каждом файле в myFiles/
, а также заменить каждый экземпляр "Happy" на "Sad" в каждом файле в myFiles/
,
Я предпринял столько попыток использования awk/sed и так далее, сколько я могу считать логичным, но не смог создать команду, которая выполняет желаемое действие.
Любое руководство приветствуется. Спасибо!
3 ответа
- Читать каждую строку из
values.txt
- Разделить эту строку в 2 слова
- использование
sed
для каждой строки заменить 1-е слово на 2-е слово во всех файлах вmyFiles/
каталог
Примечание: я использовал расширение параметра bash для разделения строки (${line% *}
и т. д.) при условии values.txt
разделенный пробелами 2 колоночный файл. Если это не так, вы можете использовать awk
или же cut
разделить линию.
while read -r line;do sed -i "s/${line#* }/${line% *}/g" myFiles/* # '-i' edits files in place and 'g' replaces all occurrences of patterns done < values.txt
Вы можете делать то, что вы хотите с помощью awk.
#! /usr/bin/awk -f
# snarf in first file, values.txt
FNR == NR {
subs[$1] = $2
next
}
# apply replacements to subsequent files
{
for( old in subs ) {
while( index(old, $0) ) {
start = index(old, $0)
len = length(old)
$0 = substr($0, start, len) subs[old] substr($0, start + len)
}
}
print
}
Когда вы вызываете его, положите values.txt
как первый файл для обработки.
Вариант первый:
- создать скрипт на python
- с open('filename', 'r') в качестве infile и т. д., читайте в файле values.txt в файл python с "from" в качестве ключа и "to" в качестве значения. закрыть инфил.
- используйте shutil для чтения в нужном каталоге, перебора файлов для каждого, для этого сделайте popen 'sed' s / from / to / g '"или для чтения в каждом файле по всем строкам, в каждой строке вы найдете / замените.
Вариант второй:
- скрипт bash
- читать в / из пары
взывать
perl -p -i -e 's/from/to/g' dirname/*.txt
сделанный
второе, вероятно, легче написать, но меньше обработки исключений. Он называется "Perl PIE" и является относительно известным хаком для поиска / замены множества файлов одновременно.