使用 sed 更新文件

Kan*_* Lg 2 unix sed

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

bra*_*zzi 6

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

/内部使用斜杠 ( )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)

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