Замена подстроки в файле a на строку в файле b при обнаружении совпадения

У меня была такая же проблема с моим HP. попробуйте загрузить новейший еженедельный выпуск Kali. http://cdimage.kali.org/kali-images/kali-weekly/ мне это помогло.

2
20.09.2016, 18:45
3 ответа

Вы можете использовать sed для создания сценария sed из file1, а затем запустить sed с этим сценарием, чтобы превратить file2 в ожидаемый результат:

sed 's!^!s/!;s! = !/!;s!$!/!' file1 | sed -f- file2

first sed выводит

s/This is a string/mystringrocks/
s/This is another string/mystringrocksmore/

, который явно выполняет необходимые вам замены.

Вы также можете использовать perl, он будет работать даже для строк, содержащих косые черты и восклицательные знаки:

perl -wE 'while (<>) {
              chomp;
              ($from, $to) = split / = /;
              $h{$from} = $to;
              last if eof;
          }
          $regex = join "|", map quotemeta, keys %h;
          s/($regex)/$h{$1}/, print while <>
         ' file1 file2

Он читает первый файл, разбивает каждую строку на = и сохраняет пару $ из => $ до в хэше. Затем он создает регулярное выражение из всех ключей (то есть из), перебирает второй файл и заменяет совпадения значениями, хранящимися в хэше. Также обычно ключи сортируют по длине, чтобы использовать более длинную строку, если есть два шаблона, которые начинаются в одном месте:

map quotemeta, sort { length $b <=> length $a } keys %h;
4
27.01.2020, 21:51

Если бы вы не выбрали разные разделители (: versus =) для двух файлов, было бы неплохо стандартная задача поиска с использованием ассоциативного массива в awk

Если у вас есть вариант GNU awk , вы можете изменить разделители между файлами с помощью правила ENDFILE , что позволит вам сделать

gawk 'BEGIN{FS=" = "} NR==FNR {a[$1]=$2;next} ENDFILE{FS=": "; OFS=FS;} {print $1, a[$2]}' file1 file2
Trying to figure out: mystringrocks
Still trying to figure it out: mystringrocksmore
1
27.01.2020, 21:51

Если вывод может быть смешанным (не сохранять исходный порядок строк), вы можете использовать join

join -o 2.1,1.2 -2 2 -t':' \
    <(sed 's/^/ /;s/ =/:/' File1 |sort -t: -k1,1)\
    <(sort -t: -k2 File2)
3
27.01.2020, 21:51

Теги

Похожие вопросы