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

时间:2015-03-09 17:18:58

标签: bash awk sed

我需要将文件中的文件名替换为cp命令的字符串,因此它应该用同一文件中的cp源目标替换现有的文件名.file是逗号分隔的     #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

现在我想要一个sed或awk命令,可以将/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, '{$3="cp "$3" "$3""}1' OFS=, test.txt,但它只是在控制台中打印ABC,TS-R:56:UT-123,cp /apps/home/t.txt /apps/home/t.txt而不是在文件中更改。

提前致谢。

3 个答案:

答案 0 :(得分:0)

这应该做:

awk -F/ '{print $1"cp ",$2,$3,$4 " ",$2,"cmb",$4}' 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

答案 1 :(得分:0)

您可以使用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

答案 2 :(得分:0)

由于这是单个行上的简单替换,因此它对于sed来说是一个合适的工作:

$ sed -r 's:(/[^/]+/)([^/]+)(/[^/]+):cp & \1cmb\3:' 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