2016-03-10 169 views
2

我需要做文本文件 如將替代以下關鍵字符串中的一組替代的桑達正則表達式

#include "martini.itp" 

3另一個字符串準確路徑的ITP文件

#include "../dir1/dir2/martini1.itp" 
#include "../dir1/dir2/martini2.itp" 
#include "../dir1/dir2/martini3.itp" 

我試圖使用下面的模式來實現它,我猜這是因爲像../這樣的字符應該使用指定的語法從sed語句中分離出來。

sed -i 's/#include "martini.itp"/#include "../dir1/dir2/martini_v2.0_lipids_all_201506.itp"\n#include "../dir1/dir2/martini_v2.0_ions.itp"\n#include "../dir1/dir2/martini_v2.0_solvents.itp"/' topol.top 
+0

你不需要逃避的空間呢?'\ ' – agilob

+0

你需要使用不同的分隔符來替換或者跳過所有的正斜槓 – 123

+0

right我需要在SED語句中轉義../我如何在我的例子中正確地做到這一點7 –

回答

0

你應該寫\.逃脫./:改變正則表達式的分隔符只是爲了防止正則表達式的分隔符衝突的一些問題,您的文件路徑。所以最後,你應該得到這樣的事情:

正則表達式:

$'s:#include "martini\.itp":#include "../dir1/dir2/martini_v2.0_lipids_all_201506.itp"\\\n#include "../dir1/dir2/martini_v2.0_ions.itp"\\\n#include "../dir1/dir2/martini_v2.0_solvents.itp":' 

運行:

sed -i '' $'s:#include "martini\.itp":#include "../dir1/dir2/martini_v2.0_lipids_all_201506.itp"\\\n#include "../dir1/dir2/martini_v2.0_ions.itp"\\\n#include "../dir1/dir2/martini_v2.0_solvents.itp":' topol.top 

輸出:

#include "../dir1/dir2/martini_v2.0_lipids_all_201506.itp" 
#include "../dir1/dir2/martini_v2.0_ions.itp" 
#include "../dir1/dir2/martini_v2.0_solvents.itp" 

注意,有一些竅門這裏逃脫newline通過將$添加到正則表達式的開頭並使用\\\n而不是\n

+0

你不需要越獄'''替換部分 – 123

+0

@ 123謝謝! – fronthem

+0

你也不需要三次轉義換行。'\ n'就足夠了。 – 123

3

如果你有固定的字符串時,您可以只用awk,並避免逃避任何東西(當然,除了一些雙引號):

awk '$0 == "#include \"martini.itp\"" { 
    $0 = "#include \"../dir1/dir2/martini1.itp\"" ORS \ 
     "#include \"../dir1/dir2/martini2.itp\"" ORS \ 
     "#include \"../dir1/dir2/martini3.itp\"" 
} 
{ print }' file > tmp && mv tmp file 

如果線路匹配,與其他替代它線。一個相當常見的簡寫是用1代替{ print },因爲1爲真,並且{ print }是默認操作。

要使用SED,我會去這樣的事情:

sed -i.bak '/#include "martini\.itp"/i\ 
#include "../dir1/dir2/martini1.itp"\ 
#include "../dir1/dir2/martini2.itp"\ 
#include "../dir1/dir2/martini3.itp" 
d' file 

此插入你想要的線,然後d刪除原線。使用-i.bak會創建原始文件的備份,這是我一直推薦的。

+0

您可以在第一部分中使用單個打印語句並保持可讀性 – 123

0

您需要難逃「。」每個實例之前把\和/字符。而且‘$’/ N爲換行符

sed -i 's/#include \"martini\.itp\"/#include \"\.\.\/dir1\/dir2\/martini1.itp\"'$'\\n#include \"\.\.\/dir1\/dir2\/martini2.itp\"\\n#include \"\.\.\/dir1\/dir2\/martini3.itp\"/g' topol.top