2014-02-11 53 views
1

我想使用sed從文件中提取兩個特定字符串之間的所有行。 我需要在腳本上執行此操作,並且我的兩個字符串是變量。 的字符串會是一種時間標記的格式,這意味着它們可以是這樣的:sed:以時間戳格式插入變量

sed -n '/$1/,/$2/p' $file 

甚至

sed -n '/"$1"/,/"$2"/p' $file 
2014/01/012014/01/01 08:01

我喜歡的東西嘗試

沒有運氣,也試圖用;代替/作爲分隔符。

我敢肯定,這個問題是由於/和輸入變量爲空,但我找不出合適的語法。

+0

有什麼錯誤/問題特別? – CoffeeRain

回答

3

的語法使用替代的正則表達式的分隔符是:

\ Ç的regexp Ç

匹配線匹配正則表達式的正則表達式。 c可以是任何字符。

https://www.gnu.org/software/sed/manual/sed.html#Addresses

所以,挑

sed -n '\@'"$1"'@,\@'"$2"'@p' "$file" 
sed -n "\\@[email protected],\\@[email protected]" "$file" 
sed -n "$(printf '\@%[email protected],\@%[email protected]' "$1" "$2")" "$file" 

一個或AWK

awk -v start="$1" -v end="$1" '$0 ~ start {p=1}; p; $0 ~ end {p=0}' "$file" 

第一 $ 1的最後 $ 2:

sed -n "\\@[email protected],\$p" "$file" | tac | sed -n "\\@[email protected],\$p" | tac 

此打印從第一$ 1結束,反轉線,從第一 $ 2輸出到新的結束,並再次反轉線。

一個例子:從最初的 「5」 到最後的 「7」

$ set -- 5 7 
$ seq 20 | sed -n "\\@[email protected],\$p" | tac | sed -n "\\@[email protected],\$p" | tac 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
+0

你想'@ p'不是'/ p'。 – tripleee

+0

非常感謝你的第一個例子做的伎倆:) – Cris

+0

只是一個更多的問題,te輸出停止在第一個$ 2的遭遇,鑑於我有多個$ 2行是否有一個優雅的方式告訴sed打印所有這些? jsut澄清我可以在多個命令總結輸出只是想知道如果我可以做一個單一的命令,對不起我老派我貪婪的代碼行:) – Cris

3

嘗試使用雙引號而不是單引號。

sed -n "/$1/,/$2/p" $file 
+0

爲了擴展csiu的回答:Cris,你可能想了解更多關於你的shell如何在單引號或雙引號內處理信息的不同方式。這是一個很好的資源:http://mywiki.wooledge.org/Quotes。 – Telemachus