以前寫 shell 腳本的幾篇文章都是先大體介紹腳本的功能和寫法,而後一股腦的給出完整的代碼。並無細緻入微的解釋腳本中的每一行是如何思考如何編寫的。shell
今天反其道而行之,只介紹一行代碼。爭取能講的清楚明白,讓你們瞭解我在寫這行代碼時的思路。微信
說說這行代碼的做用吧:經過反編譯工具 apktool 將 apk 文件反編譯後,獲得的文件中有一份 AndroidManifest.xml。但願從這份文件中獲取到 apk 的包名(Package Name)。工具
首先,我須要肯定每一個 apk 反編譯後拿到的 AndroidManifest.xml 格式是否一致。因此,我選了 BAT 三家大廠的表明做品,經過 apktool 將它們的 apk 反編譯後,發現 AndroidManifest.xml 都是同樣的格式。而且包名就在首行。這下就好辦了。
測試
鑑於它們三家的 AndroidManifest.xml 格式都同樣,我就隨便選了 QQ 的 AndroidManifest.xml 看成模版進行腳本編寫吧。
3d
如下是編寫思路:
一、由於包名在首行,因此先把第一行字符給提取出來;code
sed -n '1p' AndroidManifest.xml
二、包名所在列和其餘幾列經過空格隔開的,那就能夠把每一列轉成單獨的行;xml
sed -n '1p' AndroidManifest.xml | awk '{for(i=1;i<=NF;i++){print $i;}}'
三、由於只有包名這一列含有"package"一詞,因此能夠過濾出這行;blog
sed -n '1p' AndroidManifest.xml | awk '{for(i=1;i<=NF;i++){print $i;}}' | grep "package"
四、過濾後的這行,包名包含在兩個雙引號之間,經過將雙引號做爲截取字符便可將這行分爲三部分,輸出第二部分即爲包名。開發
sed -n '1p' AndroidManifest.xml | awk '{for(i=1;i<=NF;i++){print $i;}}' | grep "package" | awk -F '"' '{print $2}'
第四步結束,這個截取包名的腳本也就寫完了。編譯
歡迎關注微信公衆號"測試開發Stack"