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

Posted

技术标签:

【中文标题】使用 awk 或 sed 在文件中动态替换字符串【英文标题】:use awk or sed to replace string dynamically in file 【发布时间】:2015-05-10 23:07:39 【问题描述】:

我需要将文件中的文件名替换为 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, '$3="cp "$3" "$3""1' OFS=, test.txt,但它只是在控制台中打印ABC,TS-R:56:UT-123,cp /apps/home/t.txt /apps/home/t.txt,而不是在文件中更改。

提前致谢。

【问题讨论】:

【参考方案1】:

应该这样做:

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

【讨论】:

它完全按照我的要求工作,但是为什么它不对文件进行更改,它只在我尝试的控制台上打印,是我必须从脚本中使用它并且它工作吗? @innova 要将其写回文件,请执行以下操作:awk -F/ 'print $1"cp ",$2,$3,$4 " ",$2,"cmb",$4' OFS=/ file > tmp && mv tmp file【参考方案2】:

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

【讨论】:

谢谢,你的也可以,我只是输入“/home/cmb”,就完美了【参考方案3】:

由于这是对单个行的简单替换,因此它是 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

【讨论】:

以上是关于使用 awk 或 sed 在文件中动态替换字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本

如何使用“sed”或“awk”替换url参数查询字符串

sed 或 awk 替换前 14 个匹配项

sed / awk 匹配文件中第二次出现的正则表达式,并替换整行

使用 sed(或 awk 或 tr)将换行符 \n 替换为表达式

如何使用 sed/awk 或其他工具辅助查找和替换 12GB 的颠覆转储文件