从第n次出现的字符串读取到特定的字符串

时间:2013-11-01 18:06:12

标签: unix sed

我有一个内容文件:

  

[ATTRIBUTES]
  NAME = “名称1”
  默认为“ABCD”
  [表格]
  NAME = “tabCol”
  默认为“ABCD”
  类型= “ABC”
  [表格]
  NAME = “tabCol1”
  默认为“ABCD1”
  类型= “ABC1”
  [表格]
  NAME = “tabCol2”
  默认为“ABCD2”
  类型= “ABC2”

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

  

[ATTRIBUTES]
  NAME = “名称1”
  default =“abcd”

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

  

[表格]
  NAME = “tabCol1”
  默认为“ABCD1”
  type =“abc1”

我必须使用unix shell脚本。我想使用sed可能是最好的,但不知道如何。
所以请帮助。
在此先感谢

6 个答案:

答案 0 :(得分:1)

以下是使用awk执行此操作的另一种方法:

parse.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"

答案 1 :(得分: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"

答案 2 :(得分: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块。

答案 3 :(得分:0)

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

在sed中不可能,我很害怕。另一方面,awk ......

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

答案 4 :(得分:0)

有些人使用awk

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

答案 5 :(得分:0)

MyBloc="TABLE"
MyOccurence=2

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

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