2012-03-12 68 views
2

我將展示一個例子來解釋我的問題。如何在sed搜索模式中使用變量

VARIABLE='some string' 

我想要搜索的字符串中的文件,如:

sed -n "/$VARIABLE,test/p" aFile 

我知道這是錯的,因爲變量標識符「$」是用Perl模式$,這意味着該行的結束衝突。

所以我的問題是:有沒有辦法在SED圖案搜索中使用變量?

+5

外殼擴展'$ VARIABLE'雙引號內產卵'sed'之前。你的問題是'/ $ VARIABLE,+ 4 /'應該是'/ $ VARIABLE /,+ 4'。 – Benoit 2012-03-12 10:37:18

回答

3

它看起來像你想使用sed範圍標識,即/開始/,/結束/ ?.那是對的嗎?

如果是這樣,所有你需要做的就是添加了額外的「/」字符被丟失,即

sed -n "/$VARIABLE/,/test/p" aFile 

範圍可以組成行號,串/ regexs,和/或相對行號(沒有負面的回頭看)。

sed -n "1,20p" aFile 
# prints lines 1-20 

sed -n '/start/,/end/p' aFile 
# prints any text (include current line) 
# with start until it finds the word end 

sed -n '/start/,+2p' aFile 
# prints line matching start and 2 more lines after it 

我在/regex/模式中使用字符串來簡化說明。 當你瞭解它們時,你可以做真正的rex-ex像/^[A-Za-z_][A-Za-z0-9_]*/等。

按照您關於「$」評論

此外,sed中也將使用「$」爲「結束線」的指標如果字符是在被評估的REG-EX可見。另請注意,我的一些示例如何使用dbl引號或單引號。單引號意味着您的表達式sed -n '/$VARIABLE/,/test/p' aFile將匹配字符字符AND,因爲$不在reg-ex的末尾,所以它將用作常規字符。 '$'只適用於行尾,當它位於reg-ex(part)的末尾時;例如你可以做/start$|start2$/,而這兩者都意味着行尾。

正如其他人所指出的那樣,您使用的

sed -n "/$VARIABLE/,/test/p" aFile 

正在通過shell變量explasion轉換爲

sed -n "/some text/,/test/p" aFile 

所以,如果你想確保你的文本在最終的錨定你可以寫

sed -n "/$VARIABLE$/,/test/p" aFile 

其中擴展爲

sed -n "/some text$/,/test/p" aFile 

我希望這有助於

+1

不應該最後一行是sed -n「/ some text $ /,/ test/p」aFile? – 2016-02-09 21:03:22

+0

@SébastienClément:是的!你是對的。將解決這個問題。感謝您的細心目光;-) – shellter 2016-02-09 23:01:41