我需要在文本文件中进行一组替换 例如,放置而不是跟随键字符串
#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
最佳答案
如果您使用固定字符串,则可以使用 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
如果该行匹配,则将其替换为其他行。一个非常常见的简写是将 { print }
替换为 1
,因为 1
为 true,而 { 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
创建原始文件的备份,这是我一直推荐的。
关于regex - Sed 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35915047/