2

我正在尝试在文件中查找和替换几个单词并尝试将该文件作为 .sql 文件执行

sed -e "s/wordToFind1/UnixFile/g" Check.sql;
sed -e "s/wordToFind2/WordToReplace2/g" Check.sql;

在上面,我试图找到 wordToFind1 并将其替换为 UnixFile:/usr/bin/try.txt,然后尝试找到 wordToFind2 并将其替换为另一个词:tablename

sed - Check.sql 之前:

servermonitor on
spool wordToFind1
select * from wordToFind2

sed - Check.sql 之后:

servermonitor on
spool /usr/bin/try.txt
select * from tablename

完成上述更改后,我正在尝试执行 sql 文件。请帮忙!!!

4

2 回答 2

4

你有一些问题需要在这里解决。

在内部使用斜线 ( /)s///

首先,您要替换wordToFind1/usr/bin/try.txt. 它最初不适用于该s///命令,因为替换字符串包含/. 这将是一个非常奇怪的命令!

sed -e 's/wordToFind1//usr/bin/try.txt/' Check.sql

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

然而,这很笨拙。/当您的替换字符串(甚至替换字符串)中有很多内容时,恕我直言,更好的解决方案是使用另一个字符作为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

使用多个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

(另一种选择是仅在一个字符串中添加多个选项,用分号分隔:

$ sed -e 's#wordToFind1#/usr/bin/try.txt#;s/wordToFind2/tablename/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename

我发现它有时非常有用,使用更大的 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

现在,Check.sql变了。此外,还有一个Check.sql.bkp旧内容:

$ cat Check.sql.bkp 
servermonitor on
spool wordToFind1
select * from wordToFind2

如果出现问题,这可能会有所帮助。

于 2012-06-15T15:17:06.637 回答
0

我无法在 sed 中得到一些东西。所以我使用了awk。将 Replace1 和 Replace2 作为参数传递给 shell 脚本,该脚本将创建具有适当值的 ip.sql。

#!/bin/bash
awk -v R1=$1 -v R2=$2 '{gsub("wordToFind1",R1);gsub("wordToFind2",R2);print}' ip.sql > t.sql;
mv t.sql ip.sql;
于 2012-06-15T04:45:50.947 回答