Re: [問題] 進階分析字串 sed or awk
※ 引述《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
討論串 (同標題文章)
Linux 近期熱門文章
21
56
PTT數位生活區 即時熱門文章