GAWK 使用括號作為 FS
在將正則表達式設置為 FS 為 space-open_parenthersis 或 closing_parenthesis-coma-space 時,我一直在努力解決 gawk 的工作問題,我嘗試了多種方法,但都沒有達到所需的行為 1。
FS="( ()|(), )"
第二。FS="[( ()(), )]"
第 3 位(按 ASCII OCT 程式碼)FS="[(\040\050)(\051\054\040)]"
第 4 位FS="((\040\050)|(\051\054\040))"
我的輸入文件是這個https://phpaste.sourceforge.io/demo/paste.php?id=144它是一個文件,其中只有一條記錄(行)我的 apt-get 登錄 Debian 列出了一些軟體包。
我的傻瓜程序是這個
#! /usr/bin/gawk -f BEGIN {FS = "[(\040\050)(\051\054\040]"} { for(i=1;i<=NF;i=i+2) #I increased i by 2 because i want to print the odd numbered fields(only the names of the packages:architecture) print $i }`
我將在 bash 中執行它
myawk.awk input.txt > output.txt
我很想在這裡加上一個大詞 FXXX!!!!因為我剛剛解決了。我想這是對繼續嘗試的獎勵。
FS = "(\\s\\\050)|(\\\051,\\s)"
即使我真的不明白為什麼\\\
在 ASCII 八進制程式碼之前有三個反斜杠,我也使用了,並且做到了這一點。有人會對此提供一些解釋。比如為什麼??我已經讀過 AWK 兩次讀取正則表達式,這將需要
\\
但我需要\\\
(三個!!!)。任何替代或不同的方法也將不勝感激!
提前致謝!
這是我想要的結果,謝天謝地,當我從上次執行中得到它時https://phpaste.sourceforge.io/demo/paste.php?id=145(包含其架構的軟體包列表)
這一點你可能想多了。一點。我得到了它的使用
FS=" \\(|\\), "
,甚至設法將它縮短為FS=" \\(|), "
.
- 你似乎相信你需要做 的,而你需要做的只是 。
"**(***regex1***)**|**(***regex2***)**"``"*regex1*|*regex2*"
- 您似乎相信,通過將括號括在括號中,內括號將成為文字的、文本的括號。它不是那樣工作的。正則表達式分組可以嵌套;要將括號視為文字括號,您需要對它們進行轉義。
)
僅在組內的正則表達式中是特殊的。如果(
轉義了,則)
不需要。這就是棘手的地方。天真地,從上面來看,
FS=" \(|), "
應該足夠好了。但是 GAWK 在字元串常量中的正則表達式存在問題;GNU Awk 使用者指南第 9.1.3.1 節對此進行了討論。它專注於&
在替換文本中獲取文字 asub()
、gsub()
或gensub()
call ,但它似乎也適用於FS
:……有幾個級別的逃逸處理正在進行。
首先是詞法級別,即
awk
讀取程序並建構它的內部副本以執行。然後是執行時級別,也就是awk
實際掃描$$ program and determines how to execute it $$. 在這兩個級別上,
awk
查找可以出現在反斜杠之後的一組定義的字元。在詞彙級別,它查找 Escape Sequences 中列出的轉義序列。 因此,對於在執行時級別處理的每個“\”awk
,您必須在詞法級別鍵入兩個反斜杠。 …添加了重點(最後一句)。這似乎是說,如果我們想設置
FS
為" \(|), "
(轉義左括號,將括號視為文字,文本括號),您需要分配FS=" \\(|), "
或指定-F' \\(|), '
(轉義反斜杠)。您可以通過一個簡單的測試來驗證這一點:執行awk -F' \\(|), '
,然後FS
從您的程序中列印。它將顯示為 \(|),
。一般來說,如果你想把一個特殊字元變成一個非特殊字元(或者,偶爾,反之亦然),常見的傳統方法是用
\
(反斜杠)轉義它。但是還有另一種特定於正則表達式的機制:使用[…]
表達式。[…]
表達式中唯一的特殊字元是^
,**-
**和]
(這取決於位置)。
[pq]
表示一個p
或一個q
[()]
表示一個(
或一個)
[(p]
表示一個(
或一個p
[(]
表示一個(
或……好吧,因為沒有任何其他字元,它只是表示一個文字(
。所以,如果你對反斜杠過敏,你可以設置
FS=" [(]|), "
.