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

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

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

两个示例文件。

文件一:

    'text_clear' => 'Clear',
    'text_search' => 'Search',
    'text_enabled' => 'Enabled',

文件2:

emptied
lost
turned off

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

文件3:

    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

我已经成功提取了我想要编辑 python 脚本的内容,但如果可能的话,我想只使用 linux 命令来完成这两个任务。

我已经为此绞尽脑汁三个小时了。任何帮助,将不胜感激。

答案1

code.awk:

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

逐行解释:

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

答案2

另一种 awk 方法,使用matchand substr

$ awk -v pat="'[^']*'" -v q="'" -v file2='File2' '
  BEGIN{OFS=FS=" => "}
  match($2,pat) && ((getline str < file2) > 0) {
    $2 = substr($2,1,RSTART-1) q str q substr($2,RSTART+RLENGTH)
  }
  1
' File1
    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

答案3

另一个awk解决方案:

$ awk -F"'" -v OFS="'" '(getline line < "file2")==1{$4=line} 1' file1
    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

这依赖于每个输入行在要替换的字段之前有 2 个单引号字符的事实。

如果您只想替换与=> '.*',正则表达式匹配的行,那么您可以使用:

awk -F"'" -v OFS="'" '/=> \x27.*\x27,/ && (getline line < "file2")==1{$4=line} 1' file1

答案4

paste这是一个使用和 的简洁解决方案sed

$ cat file1
    'text_clear' => 'Clear',
    'text_search' => 'Search',
    'text_enabled' => 'Enabled',
$ cat file2
emptied
lost
turned off
$ paste file1 file2 | sed 's/=> \'.*\',\t\(.*\)/=> \'\1\',/'
    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

相关内容