С помощью номера строки замените целую строку на другую строку, содержащую путь к файлу.

С помощью номера строки замените целую строку на другую строку, содержащую путь к файлу.

Как заменить Old_String на New_String в файле?

Старая_строка:

$result = $client->updateInventory("UpdateInventory.xml");
Новая_строка:
$result = $client->updateInventory("/Desktop/new/UpdateInventory.xml");

Old_String в строке номер = 5 в файле file1.txt

Что я пробовал:

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'

Связанный контент