unix - 使用 sed 更新文件

标签 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 文件。请帮忙!!!

最佳答案

你有一些问题需要解决。

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

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

关于unix - 使用 sed 更新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11044424/

相关文章:

linux - Ansible 和 docker : locally build image get pulled and causes failure

bash - 如何计算 bash 中一行的长度,以便排除缩进空格?

sed - 我如何在正则表达式之后打印单词而不是相似的单词?

linux - 只打印流式 sed 的当前最后一行?

awk - 如果模式存在于另一列中,则从该列中移除模式

linux - Bash 脚本 - 遍历关联数组列表的 "variable"变量名

linux - 我可以使用 sed 来搜索字符串并追加/sub1 和一些文件 ../before search string

regex - 用awk更改字符串的大小写

c - 我如何遍历 bash 中的位置变量?

linux - 如何转义 sed 输入文件