2013-11-01 227 views
3

我有內容的文件:從字符串的第n個occurence直到一個特定的字符串讀

[屬性]中
名稱= 「名稱1」
默認爲 「ABCD」
[TABLE]
名稱= 「tabCol」
默認= 「ABCD」
類型= 「ABC」
[表格]
名稱= 「tabCol1」
默認= 「ABCD1」
TYPE = 「ABC1」
[TABLE]
NAME = 「tabCol2」
默認= 「ABCD2」
TYPE = 「ABC2」

我想要得到的特定的標題內容。就像如果我想前往的第一次出現的內容[屬性]中,輸出應該是:

[屬性]中
名稱= 「名稱1」
默認爲 「ABCD」

同樣,如果想標題表中的第二occurence的內容,輸出應該是:

[表格]
名稱= 「tabCol1」
默認= 「ABCD1」
TYPE = 「ABC1」

這個我有使用UNIX shell腳本來完成。我想這可能是最好的使用sed,但不知道如何。
所以請幫助。提前


感謝

回答

1

這裏是另一種方式,你可以使用awk做到這一點:

解析。AWK

BEGIN { FS = "[][]" } 
/^\[/ && f == n  { exit } 
/^\[/ && $2 == heading { f++ } 
f == n 

像這樣運行:

awk -f parse.awk heading=TABLE n=2 infile 

輸出:

[TABLE] 
name="tabCol1" 
default="abcd1" 
type="abc1" 
0

僅打印表款第二次出現:

在SED不可能的,我害怕。 AWK在另一方面...

awk 'BEGIN { x = 0 } ; /^\[TABLE\]/ { x = x + 1 } ; (x == 2) { print }' foo.txt 

當然,這絆倒,除非你的文件的內容,只是如此(即所有的桌子部分是一個運行在文件的結尾)。要正確地實現這個作爲一個班輪需要Perl:

perl -ne '$count{$tag = $1} += 1 if /^\[(.*?)\]$/; print if ($tag == "TABLE" && $count{$tag} == 2)' < foo.txt 
0

一些像這樣使用awk

awk 'BEGIN {printf "["} NR%2==0' RS="[" ORS="[" file 
ATTRIBUTES] 
name="name1" 
default="abcd" 
[TABLE] 
name="tabCol1" 
default="abcd1" 
type="abc1" 
1

隨着和適當的ini文件解析器:

$ perl -MConfig::IniFiles -e ' 
    my $cfg = new Config::IniFiles -file => "./conf"; 
    printf "[ATTRIBUTES]\nname=%s\ndefault=%s\n", 
     $cfg->val("ATTRIBUTES", "name"), 
     $cfg->val("ATTRIBUTES", "default"); 
' conf 
[ATTRIBUTES] 
name="name1" 
default="abcd" 
1

這可能會爲工作你(GNU sed):

sed -r '/^\[ATTRIBUTES]/!d;x;s/^/X/;/^X{1}$/{x;:a;$q;n;/^\[/Q;ba};x;d' file 

用於第一ATTRIBUTES塊,或:

sed -r '/^\[TABLE]/!d;x;s/^/X/;/^X{1}$/{x;:a;$q;n;/^\[/Q;ba};x;d' file 

用於第一TABLE塊,或:

sed -r '/^\[TABLE]/!d;x;s/^/X/;/^X{2}$/{x;:a;$q;n;/^\[/Q;ba};x;d' file 

用於第二TABLE塊或:

sed -r '/^\[TABLE]/!d;x;s/^/X/;/^X{3}$/{x;:a;$q;n;/^\[/Q;ba};x;d' file 

爲第三個TABLE區塊。

0
MyBloc="TABLE" 
MyOccurence=2 

sed -n "H 
$ {s/$/\ 
\[/;^s/\(.*\[${MyBloc}\]\){${MyOccurence}\}\(.*\n\)\[\(.*\)$/\[${MyBloc}\]\2/p" YourFile 

(無會話這裏現在測試)

相關問題