2012-10-04 46 views
1

可能重複:
bash, parsing part of a file文件在bash中解析。分離不同的子段

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

考慮到上述示例文件。命令 awk'/^case 4.2 /,/^endcase 4.2 /'./my_file.txt

將從文件中僅提取所需部分中包含的信息。 那麼,我會從這個較小的部分提取只有以「a」開頭的行嗎?我的文件比示例稍微複雜一些,但我認爲這個邏輯仍然適用。

回答

2

你可以使用sed做到這一點:

sed -n -e '/^case 4[.]2/,/^endcase 4[.]2/ { /^a/p }' my_file.txt 

-n告訴sed只對我們告訴它打印行。花括號是一組命令,並且通過使用的地址前綴(與您在awk中使用的前綴相同),我們保證它們僅在大小寫塊中執行。該組只包含一個命令,即「p」打印命令。但是,我們在此命令前加上另一個地址前綴。這個告訴它只有在行以「a」開始時才執行。

通過嵌套地址,我們可以執行以「a」文本開頭的「case 4.2」和「endcase 4.2」行,之間的命令。

希望這有助於=)

+0

怎麼樣'5的情況下'?如果有任何其他情況,如'案件6','案件7'等。 – Annjawn

+0

你是什麼意思?從我對這個問題的理解中,需要打印4.2 *和*以「a」開頭的行。這是不正確的? –

+0

OP提到了'4.2',但他的數據文件示例中還包含一個'case 5'。他會不希望'case 5'下的線條?如果沒有,那麼我想它確定。 – Annjawn

1

使用awk,我想這可能會奏效,但它並不

awk '/^case 4.2/,/^endcase 4.2/ && /^a/' filename 

取而代之的是,這個工程:

awk '/^case 4.2/,/^endcase 4.2/ {if (/^a/) print}' filename