Awk

分隔符和詞尾之間拆分()字元串的 ERE 正則表達式

  • January 17, 2014

我正在使用一個很長的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.

引用自:https://unix.stackexchange.com/questions/109491