【问题标题】:Find Replace using Values in another File使用另一个文件中的值查找替换
【发布时间】:2016-11-26 22:16:24
【问题描述】:

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

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

例如...

values.txt:

你好,再见

快乐悲伤

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

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

感谢任何指导。谢谢!

【问题讨论】:

  • 你提到了列。 values.txt 是 CSV 文件,还是您在 columns 中使用什么
  • 嗨@Un3qual,很抱歉回复晚了。该文件只是由单个空格字符分隔的两列文本。我尽力在问题中显示这一点,但在允许的格式方面存在一些问题。感谢您对我的问题感兴趣。

标签: bash awk sed terminal find-replace


【解决方案1】:

选项一:

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

选项二:

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

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

完成

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

【讨论】:

    【解决方案2】:
    1. values.txt读取每一行
    2. 将该行拆分为 2 个单词
    3. 每行使用sedmyFiles/ 目录中所有文件的第一个单词替换为第二个单词

    注意:我使用 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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-11-27
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 2018-09-14
        • 2017-01-22
        • 1970-01-01
        • 2016-05-20
        相关资源
        最近更新 更多