簡體   English   中英

具有正則表達式前瞻或后瞻的awk字段分隔符

[英]awk field separator with regexp lookahead or lookbehind

我想用轉義序列拆分但是失敗了。 例如:

$ echo "1,2\,2,333"|awk -F "(?<\!\\,)," '{print $2}'   ## expecting "2\,2"
awk: warning: escape sequence `\!' treated as plain `!'
awk: warning: escape sequence `\,' treated as plain `,'

awk / gawk是否支持帶regexp lookahead或lookbehind的字段分隔符?

正如我在評論中所說,awk不支持前瞻或后視,因為它使用POSIX擴展正則表達式(ERE)。 如果你真的需要前瞻或后瞻,你可能想要使用Perl。 但是,在這種情況下,您可以稍微改變解決問題的方法。

如果數據包含分隔符,而不是通過查找未轉義的分隔符(當行中有多個\\時可能會失敗)來分割數據,則最好直接匹配字段。

匹配字段的正則表達式是/([ /([^\\\\,]|\\\\.)+/ 。) /([^\\\\,]|\\\\.)+/ 請注意,此正則表達式不知道引用的字段。 如果您想支持它們,則取決於您如何處理報價未正確關閉的情況,或者字段中有多個引號。 如果您可以假設您的數據格式正確,那么您可以想出一個適用於您的數據的正則表達式。

這是讓你入門的東西。 下面的代碼打印一行中的所有字段。

echo "1,2\,2,333" | awk '{while (match($0, /([^\\,]|\\.)+/)) {print substr($0, RSTART, RLENGTH);$0=substr($0, RSTART+RLENGTH)}}'

參考

處理此問題的一種方法是在gnu-awk中使用FPAT (按內容拆分)

awk 'BEGIN{ FPAT=",([^\\\\]*\\\\,)*[^,]*,|[^,]+" } {
  for (i=1; i<=NF; i++) {gsub(/^,|,$/, "", $i); printf "$%d: <%s>\n", i, $i}
}' <<< "1,2\,2,333"
$1: <1>
$2: <2\,2>
$3: <333>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM