使用另一个文件中的值查找替换

时间:2016-07-22 22:27:44

标签: bash awk sed terminal find-replace

我有一个文件目录myFiles/和一个文本文件values.txt,其中一列是要查找的值集,第二列是相应的替换值。

目标是将所有查找值实例(values.txt的第一列)替换为位于values.txt的所有文件中的相应替换值(myFiles/的第二列)

例如......

values.txt

Hello Goodbye

快乐悲伤

运行该命令会在myFiles/中的每个文件中将“Hello”的所有实例替换为“Goodbye”,并在myFiles/的每个文件中将“Happy”的每个实例替换为“Sad” }。

我已尽可能多地尝试使用awk / sed等,因为我认为这是合乎逻辑的,但未能生成执行所需操作的命令。

感谢任何指导。谢谢!

3 个答案:

答案 0 :(得分:1)

你可以用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 :(得分:0)

选项一:

  1. 创建一个python脚本
  2. 打开('文件名',' r')作为infile等,将values.txt文件读入python dict,其中包含'来自'作为关键,'到'作为价值。关闭infile。
  3. 使用shutil读入想要的目录,遍历文件,为每个文件,执行popen&se; s / from / to / g'"或读入每个文件,在所有行上进行交互,找到/替换每一行。
  4. 选项二:

    1. bash script
    2. 读入一对/来一对
    3. 调用

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

    4. 完成

      第二个可能更容易编写,但更少的异常处理。 它被称为Perl PIE'它是一个相对着名的黑客,可以同时在很多文件中查找/替换。

答案 2 :(得分:0)

  1. values.txt
  2. 读取每一行
  3. 用2个字分割该行
  4. 使用sed为每行代替myFiles/目录中所有文件中的第2个单词
  5. 注意:我已使用bash parameter expansion拆分行(${line% *}等),假设values.txt是空格分隔的2列文件。如果不是这种情况,您可以使用awkcut分割该行。

    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