![用另一个文件中的行替换一个文件中的正则表达式匹配项](https://linux22.com/image/182174/%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E8%A1%8C%E6%9B%BF%E6%8D%A2%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%B9%E9%85%8D%E9%A1%B9.png)
我正在尝试用=> '.*',
另一个文件中的行替换与一个文件中的正则表达式匹配的行。
两个示例文件。
文件一:
'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 方法,使用match
and 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',