2013-09-24 37 views
0

強調文本我有一個像如何將符號[和]用作gaw​​k的字段分隔符?

CreateMainPageLink("410",$objUserData,$mnt[139]); 
從中我想要的 mntgawk發生後提取數 139

一些文字。我嘗試以下表達式

gawk '{FS="[\[\]]";print NF}' 

打印字段的數目(一個pipe表達內要在grep的結果使用)。如果我的字段分隔符是[],我希望看到打印出的數字爲3(三個字段;一個在打開的矩形括號之前,一個在後,以及我想要提取的實際數字)。我得到的卻是一個,對應於全系列,和兩個警告:

gawk: warning: escape sequence `\[' treated as plain `[' 
gawk: warning: escape sequence `\]' treated as plain `]' 

我下面給here的例子,但顯然有一個與我的表情有些問題/錯誤。

使用以下兩種表達式也不起作用:

gawk '{FS="[]"}{print NF;}' 
gawk: (FILENAME=- FNR=1) fatal: Unmatched [ or [^: /[]/ 

gawk '{FS="\[\]"}{print NF;}' 
gawk: warning: escape sequence `\[' treated as plain `[' 
gawk: warning: escape sequence `\]' treated as plain `]' 
gawk: (FILENAME=- FNR=1) fatal: Unmatched [ or [^: /[]/ 

回答

1

GAWK -F [] []「{打印$ 0" - > 「$ 1」 \ t「的$ 2; }'

$ gawk -F[][] '{ print $0" -> "$1"\t"$2; }' 
titi[toto]tutu 
titi[toto]tutu -> titi toto 

1)在進入主解析循環之前,您必須設置FS。你可以這樣做:

awk 'BEGIN { FS="[\\[\\]]"; } { print $0" -> "$1"\t"$2; }' 

哪個解析文件之前執行BEGIN條款。

我必須逃避[字符兩次:一是因爲它在引用字符串中。還有一次,因爲gawk在括號表達式中強制它。

我personnaly更喜歡使用不太詳細的-F標誌。

2)FS="[\[\]]"是錯誤的,因爲你在一個帶引號的字符串裏面,這就轉義了字符串內的字符。 Awk會看到:[[]]這是一個無效的括號表達式。

3)FS="[]"是錯誤的,因爲它是一個空托架表達式試圖匹配沒什麼

4)FS="\[\]"是再次錯誤的,因爲它是錯誤2)和3)一起:)

GAWK手冊說: The regular expressions in awk are a superset of the POSIX specification。這就是爲什麼你可以使用:[\\[\\]][][]。後者是posix的方式。

要在列表中包括文字 ']',使其成爲第一個字符

參見:

+0

感謝您的解決方案,這似乎工作。但是,你是否也有解釋爲什麼你的解決方案有效,我的錯在哪裏? – Alex

+0

在你描述的手冊頁鏈接中說,要在括號表達式中包含單個']',必須將其轉義。但是,正如我們在這個問題上看到的那樣,一次轉義是錯誤的。你要麼不逃避,要麼逃脫兩次。兩者都與手冊頁相矛盾。我錯過了什麼? – Alex

+0

@Alex通過posix:你不逃避它,並使其成爲第一個字符。通過對posix的awk擴展:如果在引用的字符串內部,或者如果在引用的字符串外部,則只會執行一次兩次轉義。 – fjardon

0

你需要awk?可以通過sed得到的值是這樣的:

# echo 'CreateMainPageLink("410",$objUserData,$mnt[139]);' | sed -n 's:.*\[\([0-9]\+\)\].*:\1:p' 
139 
+0

感謝您的輸入;你的建議似乎有用,但我想知道爲什麼我的gawk表達式不起作用。另外,我不明白sed命令到底在做什麼。如果你能解釋那些會很棒的不同部分。 – Alex

1

FS="[]"這將查找[]內部的數據和有沒有。

要使用你需要他們這樣寫[][]

這方括號也是錯誤gawk '{FS="[\[\]]";print NF}'你需要FS作爲外表達的變量。

EKS

echo 'CreateMainPageLink("410",$objUserData,$mnt[139]);' | awk -F[][] '{print $2}' 
139 

或者

awk '{print $2}' FS=[][] 

或者

awk 'BEGIN {FS="[][]"} {print $2}' 

全部給139

編輯:gawk '{FS="[\[\]]";print NF}'在這裏,您打印的字段的數而不是它的值$NF。無論如何,這將無濟於事,因爲將您的數據與[]分開給出);作爲最後一個提交,使用此awk '{print $(NF-1)}' FS=[][]獲取第二個最後提交。

+0

是使用[] []在什麼地方記錄?我怎麼能發現?這是一個特殊的情況只是矩形括號?我在gawk手冊頁上找不到任何有用的參考... – Alex

+0

它學到了一些東西:)但是這個'[''開始並且這個']'停止了一個範圍。所以加入'[[]]',你會得到兩個起始組和兩個停止組。所以只有正確的方法是'[] []'或'「[] []」'。谷歌是你的朋友..你也可以使用'FS =「\\\ [| \\\]」'或'FS =「[\\\ [\\\]]」'但看起來很醜。 – Jotne

+0

@Alex它在手冊頁中爲posix正則表達式指定。看到我的回答鏈接 – fjardon

相關問題