行番号の助けを借りて、行全体をファイルパスを含む別の行に置き換えます。

行番号の助けを借りて、行全体をファイルパスを含む別の行に置き換えます。

ファイル内の Old_String を New_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'

関連情報