我有一個看起來像這樣的檔案(myfile.txt)
GYFUFGYO1 KMP-app [email protected] CODE_SMELL
GYFUFGYO2 KMP-app [email protected] CODE_SMELL
GYFUFGYG3 AFP-Login [email protected] BUG
GYFUFGYG4 AFP-Login [email protected] BUG
GYFUFGYO5 KMP-app [email protected] CODE_SMELL
GYFUFGYO6 KMP-app [email protected] CODE_SMELL
我必須將此文本內容寫入 JSON 檔案 (myfile.json)。這是預期的輸出
[
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "[email protected]"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"}
]
這就是我嘗試過的
我創建了一個名為“textconvert.sh”的檔案。然后寫了一個這樣的shell腳本。
echo"[" >> myfile.json
echo {"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"}, >> myfile.json
echo {"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"}, >> myfile.json
echo {"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "[email protected]"}, >> myfile.json
echo {"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "[email protected]"}, >> myfile.json
echo {"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"}, >> myfile.json
echo {"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"} >> myfile.json
echo"]" >> myfile.json
但我不允許像這樣硬編碼。我現在想的是,
撰寫一個回圈來掃描“myfile.txt”,然后將列值分配給變數。然后寫一個json檔案。
有人可以幫我解決這個問題嗎?
uj5u.com熱心網友回復:
使用 sed
$ sed -E 's/[^ ]* ([^ ]*) ([^ ]*) (.*)/{"ApplicationName":"\1","BuildBreakReason":"\3","DefectAuthor": "\2"},/;$s/,$/\n]/;1i[' myfile.txt
[
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "[email protected]"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"}
]
uj5u.com熱心網友回復:
使用任何 awk:
$ cat tst.awk
BEGIN {
fmt = "%s{\"ApplicationName\":\"%s\",\"BuildBreakReason\":\"%s\",\"DefectAuthor\": \"%s\"}"
print "["
}
{ printf fmt, sep, $2, $4, $3; sep="," ORS }
END { print ORS "]" }
$ awk -f tst.awk myfile.txt
[
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "[email protected]"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor": "[email protected]"}
]
關于What I am thinking now is, write a loop to scan "myfile.txt"...你的問題 - 不,不要那樣做。請參閱為什么使用-shell-loop-to-process-text-considered-bad-practice。
uj5u.com熱心網友回復:
我會AWK按照以下方式利用 GNU 來完成這項任務,讓file.txt內容成為
GYFUFGYO1 KMP-app [email protected] CODE_SMELL
GYFUFGYO2 KMP-app [email protected] CODE_SMELL
GYFUFGYG3 AFP-Login [email protected] BUG
GYFUFGYG4 AFP-Login [email protected] BUG
GYFUFGYO5 KMP-app [email protected] CODE_SMELL
GYFUFGYO6 KMP-app [email protected] CODE_SMELL
然后
awk 'BEGIN{print "["}NR>1{print ","}{printf "{\"ApplicationName\":\"%s\",\"BuildBreakReason\":\"%s\",\"DefectAuthor\":\"%s\"}",$2,$4,$3}END{print "\n]"}' file.txt
給出輸出
[
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor":"[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor":"[email protected]"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor":"[email protected]"},
{"ApplicationName":"AFP-Login","BuildBreakReason":"BUG","DefectAuthor":"[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor":"[email protected]"},
{"ApplicationName":"KMP-app","BuildBreakReason":"CODE_SMELL","DefectAuthor":"[email protected]"}
]
說明:您需要,在除最后一個字符之后,但在 GNUAWK中檢測最后一行并不容易,所以我print ,在除第一條記錄之前。我使用printf將您的空白剪切記錄重新加工為 JSON,第一個引數是字串,其中要填充的位置由 表示%s,請注意"需要轉義以表示字面量"。BEGIN和END用于將記錄封裝到[和]中。免責宣告:此代碼不會對 JSON 具有特殊含義的字符進行轉義,例如".
(在 gawk 4.2.1 中測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/503775.html
上一篇:獲取gitrepo分支名稱串列
下一篇:如何在zsh中執行變數?
