使用 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
我需要将文件中的文件名替换为 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 之后,同一个文件应该有内容
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