借助行号,将整行替换为包含文件路径的另一行

借助行号,将整行替换为包含文件路径的另一行

如何在文件中用 New_String 替换 Old_String?

旧字符串:

$result = $client->updateInventory("UpdateInventory.xml");
新字符串:
$result = $client->updateInventory("/Desktop/new/UpdateInventory.xml");

名为 file1.txt 的文件中的行号 = 5 中的 Old_String

我尝试过的:

sed '5s/.*/'$result = $client->updateInventory("/Desktop/new/UpdateInventory.xml");'/' file1.txt

答案1

您可以使用以下命令来实现相同的效果

sed "5s:.*:'$'result = '$'client->updateInventory('/Desktop/new/UpdateInventory.xml');:g" filename | sed "s:'$':$:g" | tr "'" '"'

答案2

删除内部单引号。它们结束了外部的命令,因此$result将得到扩展,并且sed可能会抱怨未完成的s命令。

相反,您可以使用命令的不同分隔符s,几乎可以使用任何内容来代替斜杠。所以

sed '5s_.*_$result = $client->updateInventory("/Desktop/new/UpdateInventory.xml")‌​;_' file1.txt

就是你想要的。

答案3

另一种方法是使用c命令清除地址指定的行

$ seq 5 | sed '2c\
foobar'
1
foobar
3
4
5

$ # with GNU-sed, assuming \ is not first character
$ seq 5 | sed '2cfoobar'

s如果替换字符串具有某些特殊字符,则和命令c都会出现问题,例如:

$ seq 3 | sed '2s/.*/abc&xyz/'
1
abc2xyz
3
$ seq 3 | sed '2cabc\tabc'
1
abc     abc
3

处理这个问题的一个可靠方法是使用r命令

$ echo 'foo&\t\n\1///\\xyz' > f1
$ seq 3 | sed -e '2rf1' -e '2d'
1
foo&\t\n\1///\\xyz
3

答案4

使用 awk 命令也可以达到结果


awk  ‘NR==5 {gsub(".*","$result = $client->updateInventory(/Desktop/new/UpdateInventory.xml);",$0);print $0}' filename| sed 's/(/&"/g' | sed 's/)/"&/g'

相关内容