用另一个文件中的行替换一个文件中的正则表达式匹配项

Mat*_*ndo 3 linux grep bash sed awk

我试图=> '.*',用另一个文件中的行替换一个文件中与正则表达式匹配的行。

两个示例文件。

文件 1:

    'text_clear' => 'Clear',
    'text_search' => 'Search',
    'text_enabled' => 'Enabled',
Run Code Online (Sandbox Code Playgroud)

文件2:

emptied
lost
turned off
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 awk/sed/grep 运行 linux 命令来创建将输出的第三个文件

文件 3:

    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',
Run Code Online (Sandbox Code Playgroud)

我已经成功地提取了我想要编辑的 python 脚本,但如果可能的话,我只想使用 linux 命令来执行这两项操作。

我已经为此苦苦思索了 3 个小时。任何帮助,将不胜感激。

Qua*_*odo 10

code.awk

BEGIN{j=1}
NR==FNR{a[NR]=$0;next}
sub(/=> '.*',$/,"=> '"a[j]"',"){++j}
1
Run Code Online (Sandbox Code Playgroud)
awk -f code.awk file2 file1 > file3
Run Code Online (Sandbox Code Playgroud)

逐行解释

  • 初始化j=1
  • 将 的每一行放入file2数组中a
  • 在 中file1,对于每一行,尝试=> '.*',$用 的串联替换与正则表达式匹配的字符串=> ' a[j] ',。如果发生替换,则增加j
  • 打印该行。
$ cat file3
    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',
Run Code Online (Sandbox Code Playgroud)

  • 我很好奇:为什么对两个文件都使用“手动”计数器 `i` 和 `j` 而不是简单的 `FNR`? (2认同)
  • @AdminBee 注意到了!`i` 确实可能是 `NR`,我在写的时候没有注意到。但如果我们假设文件 1 中可能存在不匹配的行,则不是 `j`。我假设从问题的第一句开始是可能的。 (2认同)