Строка поиска сценария TCL из файлов file1 и file 2 и заменить ее в file1 - PullRequest
0 голосов
/ 08 мая 2020

У меня 2 файла. Я хочу найти определенное c содержимое из файла 2 и заменить полную строку экземпляра в файле 1, где это содержимое соответствует.

Частичное содержимое файла 1:

// ALL xyz   vev1      Par/abc/a_xyz123_place_INT
// ALL ieug  vev2      Par/abc/b_pqr987_place_INT

Частичное содержимое файла 2:

// Vev Inst: 'Par/pgh/fgf/a_xyz123_inst'
// Vev Inst: 'Par/pgh/sgg/gdgg/b_pqr987_inst'

-

Здесь скрипт должен начать поиск содержимого между последним «/» и «_place_INT» из файла 1. Например: найденное содержимое из файла 1 будет:

a_xyz123 
b_pqr987

Теперь скрипт должен искать это содержимое поиска в файле 2, искать всю строку и заменять это искомое содержимое в файле 1: Например: сценарий будет искать "a_xyz123" в файле 2, поэтому он получит эту строку 'Par / pgh / fgf / a_xyz123 _inst'. Теперь скрипт должен заменить это в file1.

Ожидаемый выходной файл1:

// ALL xyz   vev1    'Par/pgh/fgf/a_xyz123_inst'
// ALL ieug  vev2    'Par/pgh/sgg/gdgg/b_pqr987_inst'

Здесь вы можете увидеть, что Par / abc / a_xyz123_place_INT заменен на 'Par / pgh / fgf / a_xyz123_inst' как оба из них имеет a_xyz123.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

tcl:

#!/usr/bin/env tclsh

proc main {file1 file2} {
    set f2 [open $file2 r]
    set f2contents [read $f2]
    close $f2

    set f1 [open $file1 r]
    while {[gets $f1 line] > 0} {
        if {[regexp {([^/]+)_place_INT$} $line _ pat]} {
            set re [string cat {'[\w/]+} $pat {\w+'}]
            if {[regexp $re $f2contents replacement]} {
                regsub {[\w/]+$} $line $replacement line
            }
        }
        puts $line
    }
    close $f1
}

main {*}$argv

Пример:

$ tclsh demo.tcl file1.txt file2.txt
// ALL xyz   vev1      'Par/pgh/fgf/a_xyz123_inst'
// ALL ieug  vev2      'Par/pgh/sgg/gdgg/b_pqr987_inst'
0 голосов
/ 08 мая 2020

попробуйте это

while read line; 
do 
search_str=$(echo ${line}| sed 's#.*\/##g;s#_place_INT##');
replace_str=$(grep -o "'.*${search_str}.*'" file2.txt);
if test -z "$replace_str" 
then 
    echo ${line} >> file1.txt.tmp; 
else 
    echo ${line} | awk -v str="${replace_str}" '{$NF=str; print }' >> file1.txt.tmp; 
fi
done < file1.txt
mv file1.txt.tmp  file1.txt
...