Awk

GAWK 使用括號作為 FS

  • February 22, 2017

在將正則表達式設置為 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 節對此進行了討論。它專注於&在替換文本中獲取文字 a sub()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=" [(]|), ".

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