2013-11-01 96 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 

(无会话这里现在测试)

相关问题