3

我有一个包含内容的文件:

[属性]
name="name1"
default="abcd"
[TABLE]
name="tabCol"
default="abcd"
type="abc"
[TABLE]
name="tabCol1"
default="abcd1"
type="abc1"
[表]
名称=“tabCol2”
默认=“abcd2”
类型=“abc2”

我想获取具体的标题内容。就像我想要标题 [ATTRIBUTES] 的第一次出现的内容一样,输出应该是:

[属性]
name="name1"
默认="abcd"

同样,如果想要标题表第二次出现的内容,输出应该是:

[表]
名称="tabCol1"
默认值="abcd1"
类型="abc1"

这我必须使用 unix shell 脚本来做。我想最好使用 sed,但不知道如何。
所以请帮忙。
提前致谢

4

6 回答 6

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"
于 2013-11-01T18:52:34.583 回答
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"
于 2013-11-01T19:50:43.313 回答
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块。

于 2013-11-02T18:17:08.723 回答
0

仅打印 TABLE 部分的第二次出现:

恐怕在 sed 中是不可能的。另一方面,阿克...

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

当然,除非您的文件内容如此(即所有 TABLE 部分都在文件末尾一次运行),否则这会失败。要将其正确地实现为单行,需要 perl:

perl -ne '$count{$tag = $1} += 1 if /^\[(.*?)\]$/; print if ($tag == "TABLE" && $count{$tag} == 2)' < foo.txt
于 2013-11-01T18:26:44.147 回答
0

有些人喜欢这样使用awk

awk 'BEGIN {printf "["} NR%2==0' RS="[" ORS="[" file
ATTRIBUTES]
name="name1"
default="abcd"
[TABLE]
name="tabCol1"
default="abcd1"
type="abc1"
于 2013-11-01T18:27:11.573 回答
0
MyBloc="TABLE"
MyOccurence=2

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

(现在这里没有要测试的会话)

于 2013-11-02T20:02:15.897 回答