Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 使用sed更新文件_Unix_Sed - Fatal编程技术网

Unix 使用sed更新文件

Unix 使用sed更新文件,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: servermon

我正在尝试查找并替换文件中的几个单词,并尝试将该文件作为.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
servermonitor on
spool /usr/bin/try.txt
select * from tablename
sed-Check.sql之后:

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

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

我在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;

我在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;

你有一些问题要解决

使用斜杠/内斜杠/// 首先,您想用/usr/bin/try.txt替换wordToFind1。由于替换字符串包含/,因此它一开始不会与s///命令一起工作。这将是一个非常奇怪的命令

sed -e 's/wordToFind1//usr/bin/try.txt/' Check.sql
Sed会认为该命令是s/wordToFind1//,后面有一些标志,如u和其他命令,但这没有意义,它将生成一个错误。解决方案是使用\:

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

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

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

使用斜杠/内斜杠/// 首先,您想用/usr/bin/try.txt替换wordToFind1。由于替换字符串包含/,因此它一开始不会与s///命令一起工作。这将是一个非常奇怪的命令

sed -e 's/wordToFind1//usr/bin/try.txt/' Check.sql
Sed会认为该命令是s/wordToFind1//,后面有一些标志,如u和其他命令,但这没有意义,它将生成一个错误。解决方案是使用\:

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

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

您不执行sql文件,只需将其提供给数据库的命令行工具……我不想将plsql内容放在unix脚本中,我希望它放在一个单独的文件中。你能给我一个例子吗?@nhahtdh:问题是,我试图找到一个单词,并用一个使用sed的unix路径/文件替换它。完成后,执行该.sql文件您不执行sql文件,您只需将其提供给数据库的命令行工具…我不想将plsql内容放入
unix脚本,我希望它位于一个单独的文件中。你能给我一个例子吗?@nhahtdh:问题是,我试图找到一个单词,并用一个使用sed的unix路径/文件替换它。完成后,执行该.sql文件。它是否使用unix文件路径作为word替换。。它对我不起作用:我尝试了这两个选项。/h4.sh/usr/bin/try.txt tablename,它可以工作fine@Raghuram您可以用一种更简单的方式使用sed来实现。请参阅我的答案。是否将unix文件路径作为word进行替换。。它对我不起作用:我尝试了这两个选项。/h4.sh/usr/bin/try.txt tablename,它可以工作fine@Raghuram您可以用一种更简单的方式使用sed来实现。看我的答案。问题是替换字符串应该是动态的问题是替换字符串应该是动态的