我指的是
回答:GNU awk:訪問替換文本中的捕獲組,
但帶有?
用于正則運算式匹配的量詞
我想創建if
陳述句或三元運算子 ?:
或更優雅的東西,以便如果使用反向參考的正則運算式組\\1
回傳非空字串,\\1
則插入一個任意字串(不排除),如果它回傳空字串,則插入其他任意字串。我的示例在捕獲組回傳非空字串時有效,但在反向參考為空時不回傳預期的分支“B”。如何根據反向參考的值進行條件分支?
echo abba | awk '{ print gensub(/a(b*)?a/, "\\1"?"A":"B", "g", $0)}'
uj5u.com熱心網友回復:
您可以在 gensub 中進行賦值,然后使用三元運算子的值,就像這樣
... | awk '{ v=gensub(/a(b*)?a/, "\\1", "g", $0); print v?"A":"B"}'
uj5u.com熱心網友回復:
像這樣,也許?:
$ gawk '{ print gensub(/a(.*)a/, (match($0,/a(b*)?a/)?"A":"B"), "g", $0)}' <<< abba
A
$ gawk '{ print gensub(/a(.*)a/, (match($0,/a(b*)?a/)?"A":"B"), "g", $0)}' <<< acca
B
uj5u.com熱心網友回復:
您傳遞給任何函式的任何引數中的運算式在呼叫該函式之前都會進行評估,因此gensub(/a(b*)?a/, "\\1"?"A":"B", "g", $0)
與str=("\\1"?"A":"B"); gensub(/a(b*)?a/, str, "g", $0)
which 與 相同gensub(/a(b*)?a/, "A", "g", $0)
。
因此,您不能通過對任何函式的一次呼叫來完成您顯然想要做的事情,也不能在不破壞從左到右、最左最長的順序的情況下呼叫gsub()
兩次,一次 withab a
然后再次 withaa
或類似的如果存在,這樣的替換函式會將正則運算式與輸入匹配。
看起來您可能正在嘗試執行以下操作,將 GNU awk 用于patsplit()
:
awk '
n = patsplit($0,f,/ab*a/,s) {
$0 = s[0]
for ( i=1; i<=n; i ) {
$0 = $0 (f[i] ~ /ab a/ ? "A" : "B") s[i]
}
}
1'
或使用任何 awk:
awk '
{
head = ""
while ( match($0,/ab*a/) ) {
str = substr($0,RSTART,RLENGTH)
head = head substr($0,1,RSTART-1) (str ~ /ab a/ ? "A" : "B")
$0 = substr($0,RSTART RLENGTH)
}
$0 = head $0
}
1'
但沒有樣本輸入/輸出,這是一個猜測。FWIW 給出了這個示例輸入檔案:
$ cat file
XabbaXaaXabaX
foo
abbaabba
aabbaabba
bar
abbaaabba
以上將輸出:
XAXBXAX
foo
AA
BbbBbba
bar
ABbba
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387436.html
上一篇:如何減少“elseif”陳述句?