我有一个内容文件:
[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可能是最好的,但不知道如何。
所以请帮助。
在此先感谢
答案 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)
使用perl和正确的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
(现在没有在这里测试的会话)