Найти заменить, используя значения в другом файле

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

Цель состоит в том, чтобы заменить все экземпляры значений поиска (первый столбец values.txt) с соответствующими значениями замены (второй столбец values.txt) во всех файлах, расположенных в myFiles/,

Например...

values.txt:

Привет пока

Счастливый грустный

Выполнение команды заменит все экземпляры "Hello" на "Goodbye" в каждом файле в myFiles/, а также заменить каждый экземпляр "Happy" на "Sad" в каждом файле в myFiles/,

Я предпринял столько попыток использования awk/sed и так далее, сколько я могу считать логичным, но не смог создать команду, которая выполняет желаемое действие.

Любое руководство приветствуется. Спасибо!

3 ответа

  1. Читать каждую строку из values.txt
  2. Разделить эту строку в 2 слова
  3. использование 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 как первый файл для обработки.

Вариант первый:

  1. создать скрипт на python
  2. с open('filename', 'r') в качестве infile и т. д., читайте в файле values.txt в файл python с "from" в качестве ключа и "to" в качестве значения. закрыть инфил.
  3. используйте shutil для чтения в нужном каталоге, перебора файлов для каждого, для этого сделайте popen 'sed' s / from / to / g '"или для чтения в каждом файле по всем строкам, в каждой строке вы найдете / замените.

Вариант второй:

  1. скрипт bash
  2. читать в / из пары
  3. взывать

    perl -p -i -e 's/from/to/g' dirname/*.txt

сделанный

второе, вероятно, легче написать, но меньше обработки исключений. Он называется "Perl PIE" и является относительно известным хаком для поиска / замены множества файлов одновременно.

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