Python 文件1中的TCL脚本搜索字符串&;文件2并将其替换为文件1

Python 文件1中的TCL脚本搜索字符串&;文件2并将其替换为文件1,python,shell,awk,tcl,Python,Shell,Awk,Tcl,我有两个文件。我想从文件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'

我有两个文件。我想从文件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'
--

在这里,脚本应该开始搜索文件1中最后一个“/”和“\u place\u INT”之间的内容。例如: 从文件1中搜索的内容将是:

a_xyz123 
b_pqr987
现在,脚本应该在文件2中查找此搜索内容搜索整个字符串,并替换文件1中的此搜索内容: 例如:脚本将在文件2中搜索“a_xyz123”,因此它将得到这个字符串“Par/pgh/fgf/a_xyz123\u inst”。 现在,脚本应该在文件1中替换这个

预期输出文件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',因为这两个都有一个_xyz123。

试试这个

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
读行时
;
做
search_str=$(echo${line}|sed's#.*\/#g;s#u place#u INT#);
替换_str=$(grep-o“'.${search_str}.*'”file2.txt);
如果测试-z“$replace_str”
然后
echo${line}>>file1.txt.tmp;
其他的
echo${line}|awk-v str=“${replace_str}”{$NF=str;print}>>file1.txt.tmp;
fi
完成
tcl:

例如:

$tclsh demo.tcl file1.txt file2.txt
//所有xyz vev1‘Par/pgh/fgf/a_xyz123_inst’
//所有ieug vev2‘Par/pgh/sgg/gdgg/b_pqr987_inst’

欢迎来到SO。请分享你到目前为止所做的尝试。我在awk中尝试过,但不起作用,TCL新手需要帮助:awk-F“[=:,]”FNR==NR{a[$4]=$0;a{split(a[$4],b]中的next}$2;for(i=3;我在你的帖子中提到了这一点。@programmer34043059:你在Tcl中试过这个命令吗?另外,如果你不知道Tcl,为什么要在Tcl中写这个?为什么这个问题被标记为python?
我在awk中试过,但没有成功
-“没有成功”是最糟糕的问题描述。发布您在问题中尝试过的内容,并告诉我们它以何种方式“不起作用”(输出错误、无输出、语法错误、内核转储、其他情况?)如果您需要帮助。并且要清楚,您是否正在使用任何一种特定工具寻找解决方案-您将TCL放在主题行中,这是您想要使用的唯一工具吗?如果是,请删除所有其他标记,如果不是,则将其从主题中删除。如何将其存储在新文件中?我尝试执行此脚本,但出现以下错误:似乎像“cat”不工作
未知或不明确的子命令“cat”:在执行“string cat{'[\w/]+}$pat{\w+}”(过程“main”)时,必须是bytelength、compare、equal、first、index、is、last、length、map、match、range、repeat、replace、reverse、tolower、totitle、toupper、trim、trimlight、wordend或wordstart第9行)从“main{*}$argv”(文件“tcl_script.tcl”第21行)中调用
@programmer34043059 Shell重定向是一种简单的方法。如果没有
字符串cat
,你一定是使用了一个非常过时的tcl版本。请参阅感谢@Ed我尝试用
awk
编写代码,但选择了更简单的路径。我会在
awk
tommorowy中更新我的答案。欢迎你。关于“更简单”的问题路径是,除了运行速度非常慢之外,它还包含一些潜在的bug,这些bug会在各种输入值、运行脚本的目录内容、环境设置等情况下再次攻击您。要健壮地编写它,远不如编写awk脚本那么容易,然后您仍然具有执行速度和可移植性问题。
#!/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