繁体   English   中英

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

[英]Issue with bash script using SED/AWK for substituion

我一直在编写这个工作中的小脚本来释放我自己的时间,目前我被困在其中。 该脚本应该从 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:如果我没有正确解释某些内容或者您觉得缺少某些信息,请发表评论并告诉我,以便我更好地解释问题。

oldname、newname 和您的输入数据有很多可能的值可能导致您编写的任何一个命令失败 - 不要在任何命令中使用“用启用反向引用的字符串替换正则表达式”方法,使用代替字符串操作(这意味着您不能使用 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM