2012-10-04 177 views
0

解析部分试想一下,一个文本文件类似如下:庆典,文件

Case 4 
case 4.1 
a 3 
a 5 
a 7 
a 1 
a 9 
a 4 
endcase 4.1 
// 
. 
. 
. Do things that dont get parsed 
. 
. 
// 
case 4.2 
a 1 
b 3 
a 6 
b7 
endcase 4.2 
endcase 4 
// 
. 
. 
. 
. More things 
. 
. 
// 
case 5 
. 
. 
. 
. 
endcase 5 

一个包含多个变量的值,在不同的时间点。例如,案例4涉及变量a和b。我如何只提取case case 4.1和endcase 4.1之间的界限?

回答

1

可以使用AWK,例如:

awk '/^case 4.1/,/^endcase 4.1/' ./your_file 
+0

awk'/^case 4.1 /,/^endcase 4.1 /'./your_file |而读线;做;东西;完成; 这看起来可能有用吗? – confusified

+0

是的,它会处理结果行,但请记住表达式还将包含在输出“case 4.1”和“endcase 4.1”中。如果你想要一个干净的输出,你可能想grep -v他们。 – hovanessyan

+0

我的文本文件并不像上面的示例那样干净,还有进一步的解析需要,但是这一点我知道该怎么办......我真的需要学习awk .. – confusified

2

要匹配两个图案之间的线,使用:

/case 4\.1/,/endcase 4\.1/ 

打印匹配该模式的行:

sed -n '/case 4\.1/,/endcase 4\.1/p' yourfile.txt 
0
#!/bin/bash 
IFS=$'\n'; 
line="$(cat case.txt)" 

for lines in ${line} 
do 

     if [[ $lines =~ case(.*)$ ]]; then 
       caseid=`echo "${BASH_REMATCH[1]}"` 
       echo "----> $caseid" 
     fi 

     if [[ $lines =~ endcase ]]; then 
       caseid="0" 
     fi 
       if [ "$caseid" != "0" ]; then 
         echo $caseid -- $lines; 
       fi 

done 

这将解析通过文件和对于每一种情况下打印出的价值观 - 如果你想,如果你要打印特定的子case块通过,而解析不是寻找一个特定的情况下

0

:如果你想打印所有

awk -v casenum=4.1 ' 
    $1 == "case" && $2 == casenum {prnt = 1} 
    prnt 
    $1 == "endcase" && $2 == casenum {prnt = 0} 
' filename 

subcases:

awk ' 
    $1 == "case" && $2 ~ /^[0-9]+\.[0-9]+/ {casenum = $2; prnt = 1} 
    prnt 
    $1 == "endcase" && $2 == casenum {prnt = 0} 
' filename