使用 awk 或 sed 动态替换文件中的字符串

use awk or sed to replace string dynamically in file

我需要将文件中的文件名替换为 cp 命令的字符串,因此它应该用同一文件中的 cp 源目标替换现有文件名。文件以逗号分隔 #m 示例文件

ABC,TS-R:56:UT-123,/apps/home/t.txt
ICA,Y6734YGSU,/apps/home/t2.txt
MDI,UI-HDGD-PO567,/apps/home/t3.txt

现在我想要一个可以将 /apps/home/<filename>.txt 替换为 cp /apps/home/<filename>.txt /apps/cmb/<filename>.txt

的 sed 或 awk 命令

所以在 sed/awk 之后,同一个文件应该有内容

ABC,TS-R:56:UT-123,cp /apps/home/t.txt /apps/cmb/t.txt
ICA,Y6734YGSU,cp /apps/home/t2.txt /apps/cmb/t2.txt
MDI,UI-HDGD-PO567,cp /apps/home/t3.txt /apps/cmb/t3.txt

我试过 awk -F, '{="cp "" """}1' OFS=, test.txt 但它也只是在控制台中打印 ABC,TS-R:56:UT-123,cp /apps/home/t.txt /apps/home/t.txt 而不是在文件中更改。

提前致谢。

应该这样做:

awk -F/ '{print "cp ",,, " ",,"cmb",}' OFS=/ file
ABC,TS-R:56:UT-123,cp /apps/home/t.txt /apps/cmb/t.txt
ICA,Y6734YGSU,cp /apps/home/t2.txt /apps/cmb/t2.txt
MDI,UI-HDGD-PO567,cp /apps/home/t3.txt /apps/cmb/t3.txt

你可以使用 awk:

awk -F, -v OFS=, '{p=$NF; sub(/\/home\//, "/cmb/", $NF); 
     $NF=sprintf("cp %s %s", p, $NF)} 1' file
ABC,TS-R:56:UT-123,cp /apps/home/t.txt /apps/cmb/t.txt
ICA,Y6734YGSU,cp /apps/home/t2.txt /apps/cmb/t2.txt
MDI,UI-HDGD-PO567,cp /apps/home/t3.txt /apps/cmb/t3.txt

由于这是对各行的简单替换,因此适合 sed 的工作:

$ sed -r 's:(/[^/]+/)([^/]+)(/[^/]+):cp & cmb:' file
ABC,TS-R:56:UT-123,cp /apps/home/t.txt /apps/cmb/t.txt
ICA,Y6734YGSU,cp /apps/home/t2.txt /apps/cmb/t2.txt
MDI,UI-HDGD-PO567,cp /apps/home/t3.txt /apps/cmb/t3.txt