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。如何仅提取案例 4.1 和 endcase 4.1 之间的行?

4

4 回答 4

2

要匹配两个模式之间的行,请使用:

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

打印与此模式匹配的行:

sed -n '/case 4\.1/,/endcase 4\.1/p' yourfile.txt
于 2012-10-04T08:59:00.703 回答
1

您可以使用 awk,例如:

awk '/^case 4.1/,/^endcase 4.1/' ./your_file
于 2012-10-04T08:57:52.137 回答
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

这将解析文件并为每种情况打印出值 - 如果您想解析而不是寻找特定情况

于 2012-10-04T11:13:16.050 回答
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
于 2012-10-04T13:30:17.250 回答