2016-03-10 173 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