Linux

用另一個文件中的行替換一個文件中的正則表達式匹配

  • October 23, 2020

我正在嘗試用=> '.*',另一個文件中的行替換與一個文件中的正則表達式匹配的行。

兩個範例文件。

文件 1:

   '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 命令來完成這兩項工作。

我已經為此苦苦思索了 3 個小時。任何幫助,將不勝感激。

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',

另一種 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',

引用自:https://unix.stackexchange.com/questions/615767