使用SED / AWK进行替换的bash脚本问题

时间:2016-09-20 17:15:50

标签: bash awk sed

我一直在研究这个小脚本工作,以释放我自己的时间,目前我仍然坚持部分。该脚本应该从JSON中提取一些内容,修改内容,然后重新上传。修改部分是不起作用的部分。

从JSON中提取内容后的内容示例如下:

<p>App1_v1.0_20160911_release.apk</p<p>App2_v2.0_20160915_beta.apk</p><p>App3_v3.0_20150909_VendorRelease.apk</p>

修改函数应该使用相同位置的较新应用程序文件名更新列表。我已经尝试过使用SED和AWK来实现这个功能,但我还没有快速完成任务。

以下是我尝试在示例文件上运行的替换命令和替换参数的示例:

old_name=App1_.*_release.apk
new_name=App1_v1.0_20160920_1152_release.apk

sed "s/$old_name/$new_name/" body > upload

awk -v oldname="$old_name" -v newname="$new_name" '{sub(oldname, newname)}1' body > upload

最终发生的事情是替换将改变列表的正确部分,但随后在该点与列表末尾之间进行核对。

感谢您的帮助。

PS:如果我没有正确解释某些内容或者您觉得某些信息丢失了,请发表评论并告诉我,以便我能更好地解释问题。

1 个答案:

答案 0 :(得分:1)

oldname,newname和输入数据有很多可能的值可能会导致您编写的命令失败 - 请不要在任何情况下使用“将regexp替换为带有反向引用的字符串”方法命令,改为使用字符串操作(这意味着你不能使用sed,因为sed不支持字符串)

这会根据您的需要修改您的示例输入:

$ awk -v new='App1_v1.0_20160920_1152_release.apk' 'BEGIN{RS="</p>\n?"; FS=OFS="<p>"} NR==1{$2=new} {printf "%s%s", $0, RT}' file
<p>App1_v1.0_20160920_1152_release.apk<p>App2_v2.0_20160915_beta.apk</p><p>App3_v3.0_20150909_VendorRelease.apk</p>

如果这还不够,请编辑您的问题以更好地解释您的要求,并提供更具真实代表性的样本输入/输出。

以上使用GNU awk进行多字符RS和RT。