Re: [問題] 進階分析字串 sed or awk

看板Linux作者時間17年前 (2008/09/17 17:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/4 (看更多)
※ 引述《godfield.bbs@ptt.cc (咖啡貓)》之銘言: > 這是一個看似簡單, 其實卻很複雜的問題, > 如果甚至想處理更複雜的, 像以下這行: > 123,"ab,cd\"efg",456 > 這個用 perl 就簡單多了, 因為有現成的模組. > 請參考 man perlfaq4 找到其中有關以下問題: > How can I split a [character] delimited string except when inside > [character]? 這個問題可以用 sed 搭配正規式來解. 若要取出第三個欄位, 假設每行至少都有三個欄位, 每欄位亦可由一組雙引號含括起來, 雙引號內可採用 escape sequence. 以下的 sed script 可用來取出第三個欄位 (因使用 ERE, extended regular expressions, 執行 sed 時須加上 -r 選項) s/([^,"]*|"([^"\\]|\\.)*")(,|$)/\n&\n/3 s/^.*\n(.*)\n.*/\1/ s/,$// 以上三步驟分別是 1.先在第三個欄位前後各加 \n 2.再把非第三欄位的部分去掉 3.把欄位最後之逗號去除 在撰寫第一步的正規式時, 若能先劃個 FA (finite automata, 有限狀態機), 會比較容易點. -- ================================================================ Red Hat Certified Engineer 『Linux 核心研究篇』(Linux Kernel Internals, 2 ED)譯者 http://www.rtfiber.com/~changyj/ 2006/08/08 死亡車禍紀要 http://www.rtfiber.com/~changyj/sed sed 與正規式, 英文版 ================================================================ -- ※ Origin: SayYA 資訊站 <bbs.sayya.org> ◆ From: 61-30-72-184.static.tfn.net.tw
文章代碼(AID): #18qCTE00 (Linux)
文章代碼(AID): #18qCTE00 (Linux)