regex - Sed 正则表达式

标签 regex bash sed

我需要在文本文件中进行一组替换 例如,放置而不是跟随键字符串

#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/

相关文章:

awk - 使用sed删除除结束模式以外的行范围

jquery - 使用 jQuery 从字符串中获取完整 URL

javascript - 如何使用正则表达式匹配多个值返回单个值?

c# - 在 C# 中使用正则表达式解析电子邮件

bash - 通过ssh自动使用与用户默认设置不同的shell。

linux - 在 Linux 中替换 bash 中的 XML 值

jquery - 如何使用正则表达式验证 jquery 中的 url 地址?

python - Cronjob - 如何输出 stdout 并忽略 stderr

python - 如何将 Python 变量传递给 Bash?

regex - 正则表达式中的召回值