行番号を使用して、行全体をファイルパスを含む別の行に置き換えます。

行番号を使用して、行全体をファイルパスを含む別の行に置き換えます。

ファイルでOld_StringをNew_Stringに置き換えるには?

前の文字列:

$result = $client->updateInventory("UpdateInventory.xml");
新しい文字列:
$result = $client->updateInventory("/Desktop/new/UpdateInventory.xml");

行番号 = 5 の file1.txt というファイルの 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'

関連情報