使用SED/AWK替换bash脚本时出现问题

使用SED/AWK替换bash脚本时出现问题,bash,awk,sed,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> 最终发生的是替

我一直在工作中编写这个小脚本来腾出我自己的时间,现在我被困在其中。脚本应该从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>
最终发生的是替换将改变列表中正确的部分,但随后会在该点和列表末尾之间对所有内容进行核爆

谢谢你的帮助


PS:如果我没有正确解释某些内容,或者您觉得缺少一些信息,请发表评论并让我知道,以便我能更好地解释问题。

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>
$awk-v new='App1_v1.0_20160920_1152_release.apk''开始{RS=“

\n?”;FS=OFS=“”}NR==1{$2=new}{printf”%s%s“,$0,RT}文件 App1\u v1.0\u 20160920\u 1152\u发行版.apkApp2\u v2.0\u 20160915\u beta.apk

App3\u v3.0\u 20150909\u VendorRelease.apk

如果这还不够,那么编辑您的问题以更好地解释您的需求,并提供更具代表性的示例输入/输出


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

回想一下旧版reg ex中的“最长匹配”概念,即您的尾部
*\u版本。apk
匹配最长字符串,直到
\u版本。apk
。您可以展开

集,使它们成为一对一行。然后您可以让它工作。其他人可以发布““非最长匹配”解决方案,祝您好运!您的示例数据中似乎有输入错误:
…lease.apkAre您是否在重新上传前重新创建了
JSON
?将其包含在您的问题中可能会有所帮助。
$ 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>