2016-03-22 121 views
0

我寫信目的是要在在OS X上運行的bash我有看起來像這樣的降價文件腳本中:提取部分給一個變量,從一個shell腳本

# File name 

## Heading 1 

Some text 


## Heading 2 

* List item 1 
* List item 2 


## Some other section 
... 

我試圖將Heading 2中的所有內容讀入一個變量,並且我嘗試使用sedgrepperl,但無法獲得工作解決方案。在那些工具中,它看起來(理論上)是可能的,也是最簡單的,尤其是考慮到我需要多行代碼。它看起來像這個表達式作品(至少在JavaScript語法):

## Heading 2\s+(.+)\s+ 

我想保持它的一行,並堅持對股票OS X(埃爾卡皮坦10.11)僅適用工具。假設我只知道「標題2」,而不是以下標題標題。

回答

1

隨着SED:

$ myvar=$(sed "/^## $1$/,/^## Heading/!d;//d;/^$/d" file) 
$ echo "$myvar" 
* List item 1 
* List item 2 

您可以刪除/^$/d,如果你想保留空白行。

更新:

我把它換成單引號用雙引號允許shell擴展。

您可以撥打電話./scriptname.sh "Heading 2"

幾點說明:

  • /^## $1$/,/^## Heading/應用於後續命令匹配所述第一圖案到包含所述第二圖案下一行線。
  • !d刪除除範圍以外的所有行。
  • //d與地址(es)匹配相同的模式並將其刪除。
+0

謝謝,這是行之有效的 - 我將如何閱讀「標題2」作爲bash腳本的參數?我嘗試用'$ 1'替換它,但沒有輸出。 – Dov

+1

@Dov變量在雙引號字符串中擴展,而不是單引號字符串。 – Barmar

+0

我需要做一些調整 - 你能分解一下你的'sed'表達式的每個部分在做什麼? – Dov

0

您可以使用awk範圍:

awk '/^## Heading 2/,/^## Heading [^2]/ {if (!/^## Heading 2/&&!/^## Heading [^2]/) { print}}' 

或變量

awk '/s/,/e/ {if ($0 !~ s && $0 !~ e) { print}}' s='^## Heading 2' e='^## Heading [^2]' 
0

使用sed

head2="$(sed -n '/## Heading 2/,/## Heading 3/{s/^## Heading .*//;p;}' file)" 

echo "$head2" 


* List item 1 
* List item 2 

使用perl

head2="$(perl -0pe 's/(?s).*## Heading 2\s*(.*)\s*## Heading 3.*/\1/' file)" 

echo "$head2" 
* List item 1 
* List item 2 

您也可以使用home brew安裝GNUgrep,並使用這個表達式:

head2="$(grep -zoP '## Heading 2\s*\K[\s\S]*(?=\s*## Heading 3)' file)" 
相關問題