Awk
分隔符和詞尾之間拆分()字元串的 ERE 正則表達式
我正在使用一個很長的gawk 3.1.6腳本將 Zim markdown 文本複雜地轉換為 GtkDialog 程式碼,並被困在以下問題上……
範例 ASCII 輸入…
[[link|label label]] [[link]] @tag more text
命令行測試以找到正確的正則表達式…
re="[][][][]"; echo '[[link|label label]] [[link]] @tag more text' | awk -v RE=$re '{split($0,A,RE); printf "\n(" A[1] ")(" A[2] ")(" A[3] ")(" A[4] ")(" A[5] ")(" A[6] ")(" A[7] ")(" A[8] ")\n"}'
正則表達式
"[][][][]"
很好地拆分了兩個超連結形式,所以這不是問題。如果我們可以把它分成兩部分,那就更容易理解了——
"[][]"
和"[][]"
。我們正在尋找“$$ [" or " $$]" 來拆分。必須顛倒類中字元的順序以符合類元字元限制。
問題在於還將“@tag”拆分為“tag”。“tag”可以是任何字母數字文本,後跟空格或字元串結尾。
執行上面的命令行測試會產生…
()(link|label label)( )(link)( @tag more text)()()
但我需要它來產生…
()(link|label label)( )(link)( )(tag)(more text)
我已經嘗試了許多正則表達式字元串
"[][][][]|@[[:alnum:]]*"
,例如刪除整個單詞並產生…()(link|label label)( )(link)( )( more text)()
並
"[][][][]|@"
產生…()(link|label label)( )(link)( )(tag more text)()
有任何想法嗎?
我認為您不能在單個正則表達式中執行此操作,但是由於您使用的是 gawk,因此可以使用一些 gawk 擴展:
awk '{ n = split($0, a, /\[\[|\]\]|@[[:alnum:]]+/, s) for (i=1; i<=n; i++) { printf "(%s)", a[i] if (match(s[i], /^@(.+)/, m)) printf "(%s)", m[1] } print "" }' <<END [[link|label label]] [[link]] @tag more text some text with @anothertag and [[another|link]] END
()(link|label label)( )(link)( )(tag)( more text) (some text with )(anothertag)( and )(another|link)()
這是醜陋和可怕的,但提供了所需的輸出:
$ echo '[[link|label label]] [[link]] @tag more text' | awk -vFS="[\\\\[\\\\] @]" '{ OFS=":"; printf "\n(" $1 ")(" $3" "$4 ")(" $5 ")(" $9 ")(" $10 ")(" $13 ")("; rest=$14; for(i=15;i<=NF;i++){rest=rest" "$(i)} printf "%s)\n", rest; }' ()(link|label label)()(link)()(tag)(more text)
訣竅是將欄位分隔符設置為
[
,]
或@
(space). If you can do so within your program, it should give the desired output.