簡體   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