使用sed更新文件

时间:2012-06-15 04:04:57

标签: unix sed

我正在尝试查找并替换文件中的几个单词并尝试将该文件作为.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文件。请帮忙!!!

2 个答案:

答案 0 :(得分: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。这很简单:只需在同一个sed调用中传递另一个-e命令:

$ 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

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

答案 1 :(得分: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;