【发布时间】:2020-09-02 01:15:27
【问题描述】:
我需要搜索文件中的一个字符串并将其替换为另一个字符串。通常可以使用
sed -i 's/old-text/new-text/g' input.txt
但是,如果替换字符串是诸如
之类的命令的选项,这将不起作用INCPATH = -I. -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I.
我将这些字符串存储在 bash 变量中
new_string=$(sed -n '/INCPATH = /,/^$/p' Makefile_qmake)
old_string=$(sed -n '/INCPATH = /,/^$/p' Makefile_skeleton)
我需要执行替换,将文件中的旧字符串替换为新字符串。
sed -i "s/'${old_string}'/'${new_string}'/" Makefile
问题是sed 认为替换字符串包含自己的命令。我不希望替换字符串中的命令被解释为命令。我希望它执行盲搜索和替换,而不扩展命令。
【问题讨论】:
-
sed可能不是最好的工具。perl有一个引号运算符,它会自动转义正则表达式中所有具有特殊含义的字符。 -
@Barmar 举个例子?
-
您能否提供
old_string、new_string的示例以及预期输出? -
@ThatsWhatSheCoded
old_string和new_string都是 Makefile 的一部分,无论是选项还是规则。