bash,解析文件的一部分

时间:2012-10-04 08:48:46

标签: bash parsing

想象一下文本文件,如下所示:

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。如何仅提取说明案例4.1和结束4.1之间的界限?

4 个答案:

答案 0 :(得分:2)

要匹配两种模式之间的线条,请使用:

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

打印与此模式匹配的行:

sed -n '/case 4\.1/,/endcase 4\.1/p' yourfile.txt

答案 1 :(得分:1)

您可以使用awk,例如:

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

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

这将解析文件并为每个案例打印出值 - 如果你想解析而不是寻找特定的案例

答案 3 :(得分:0)

如果要打印特定的子案例块:

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

如果要打印所有子类:

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