1

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

目标是values.txtvalues.txt位于myFiles/.

例如...

values.txt

你好再见

快乐悲伤

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

我尽可能多地尝试使用 awk/sed 等,但我无法生成执行所需操作的命令。

任何指导表示赞赏。谢谢!

4

3 回答 3

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其作为要处理的第一个文件。

于 2016-07-24T00:11:51.873 回答
1
  1. 读取每一行values.txt
  2. 将该行拆分为 2 个单词
  3. 用于每一行将目录sed中所有文件中的第一个单词替换为第二个单词myFiles/

注意:我使用 bash参数扩展来分割行 ( ${line% *}etc),假设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
于 2016-07-23T01:31:11.163 回答
0

选项一:

  1. 创建一个python脚本
  2. 使用 open('filename', 'r') 作为 infile 等,将 values.txt 文件读入 python dict,其中 'from' 作为键,'to' 作为值。关闭文件。
  3. 使用shutil读取想要的目录,遍历文件,为每个文件执行popen 'sed's/from/to/g'" 或读取每个文件,遍历所有行,找到/替换的每一行。

选项二:

  1. bash 脚本
  2. 读入从/到对
  3. 调用

    perl -p -i -e 's/from/to/g' 目录名/*.txt

完毕

第二个可能更容易编写但更少的异常处理。它被称为“Perl PIE”,它是一个相对著名的黑客,用于一次在大量文件中进行查找/替换。

于 2016-07-22T22:36:09.757 回答