我正在尝试查找并替换文件中的几个单词,并尝试将该文件作为 .sql 文件执行
sed -e "s/wordToFind1/UnixFile/g" Check.sql;
sed -e "s/wordToFind2/WordToReplace2/g" Check.sql;
Run Code Online (Sandbox Code Playgroud)
在上面,我试图找到 wordToFind1 并将其替换为 UnixFile : /usr/bin/try.txt 然后,尝试找到 wordToFind2 并将其替换为另一个单词: tablename
在 sed之前- Check.sql :
servermonitor on
spool wordToFind1
select * from wordToFind2
Run Code Online (Sandbox Code Playgroud)
sed - Check.sql之后:
servermonitor on
spool /usr/bin/try.txt
select * from tablename
Run Code Online (Sandbox Code Playgroud)
完成上述更改后,我将尝试执行 sql 文件。请帮忙!!!
您在这里有一些问题需要解决。
/内部使用斜杠 ( )s///首先,您要替换wordToFind1为/usr/bin/try.txt. s///它首先不适用于该命令,因为替换字符串包含/. 这将是一个非常奇怪的命令!
sed -e 's/wordToFind1//usr/bin/try.txt/' Check.sql
Run Code Online (Sandbox Code Playgroud)
sed 会认为该命令带有s/wordToFind1//一些标志(例如u)和后面的其他命令,但这没有任何意义,并且会生成错误。一个解决方案是使用以下命令/转义每个:/usr/bin/try.txt\
$ sed -e 's/wordToFind1/\/usr\/bin\/try.txt/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from wordToFind2
Run Code Online (Sandbox Code Playgroud)
然而,这很笨拙。/当替换字符串(甚至替换字符串)中有很多 时,更好的解决方案恕我直言是使用另一个字符作为 的分隔符s///。并非每个人都知道这是可能的,但可以使用任何其他字符而不是/作为 的分隔符s///。在这种情况下,您可以/在表达式中使用任意数量的内容,而无需转义它们。在下面的示例中,我使用#代替/,因此斜杠不会/usr/bin/try.txt造成任何麻烦:
$ sed -e 's#wordToFind1#/usr/bin/try.txt#' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from wordToFind2
Run Code Online (Sandbox Code Playgroud)
s///命令解决了,你wordToFind2也该换了。-e这很简单:只需在同一个 sed 调用中传递另一个命令:
$ sed -e 's#wordToFind1#/usr/bin/try.txt#' -e 's/wordToFind2/tablename/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename
Run Code Online (Sandbox Code Playgroud)
(另一种选择是仅在一个字符串中添加多个选项,并用分号分隔:
$ sed -e 's#wordToFind1#/usr/bin/try.txt#;s/wordToFind2/tablename/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename
Run Code Online (Sandbox Code Playgroud)
我发现它有时非常有用,对于更大的 sed 脚本,但它的可读性也较差)。
-i现在,您需要更新该Check.sql文件。这也很简单:只需将-i标志传递给 sed 即可。该标志使 sed 更新原始文件。此外,该标志还可以接收一个参数,即要添加到具有原始内容的备份文件中的扩展名。在这种情况下,我将使用该.bkp扩展。查看结果:
$ sed -i.bkp -e 's#wordToFind1#/usr/bin/try.txt#' -e 's/wordToFind2/tablename/' Check.sql
$ cat Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename
Run Code Online (Sandbox Code Playgroud)
现在,Check.sql改变了。另外,还有一个Check.sql.bkp旧内容:
$ cat Check.sql.bkp
servermonitor on
spool wordToFind1
select * from wordToFind2
Run Code Online (Sandbox Code Playgroud)
如果出现问题,这可能会有所帮助。