“sed: ikame ifadesinde hatalı seçenek” döndürerek sed komutu


0

Örneğin: - file.txt adlı bir dosyam var

$ cat file.txt
$key

Bir ortam değişkenine sahibim, örneğin: bir metin dosyasında $ key

ve $ key = 1234 diyelim, böylece değeri aşağıdaki komutla değiştirebilirim

sed -i 's/$key/'"$key"'/' file.txt 

ve olur

$ cat file.txt
1234

Benim sorunum eğer değeri ise

$key = 1/2/3/4

Aşağıdaki komutu çalıştıramıyorum

sed -i 's/$key/'"$key"'/' file.txt  

Bir hata verecektir

sed: bad option in substitution expression

Eğik çizgi yüzünden kırılıyor. Doğrudan değeri vererek bunu çözebilirim, ancak bu şekilde kullanmak istemiyorum.

sed -i 's/$key/1\/2\/3\/4/' file.txt 

Yanıtlar:


5

Problem, sedsınırlayıcının olduğu /ve içindeki metinle çakıştığı gerçeğiyle ilgilidir $key. Çözmek için başka bir sınırlayıcı kullanın. Örneğin, #:

$ key="1/2/3/4"
$ echo 1/2/3/4 | sed "s#$key#\"$key\"#" 
"1/2/3/4"

Veya

$ echo "hello this is 1/2/3/4 yeah" | sed "s#$key#\"$key\"#"
hello this is "1/2/3/4" yeah

İlginç okuma: Hangi sınırlayıcıları sed içinde kullanabilirsiniz? . Spoiler: hemen hemen her şey!


Sorun, değişkenin hangi karakterleri içereceğini bilmemenizdir.
choroba

1

Kurtarmaya Perl:

perl -pe 's/\$([[:alnum:]]+)/$ENV{$1}/'

Açıklama:

  • \$ dolar işareti ile eşleşir.
  • [[:alnum:]]rakam, harf ve alt çizgi ile eşleşir, yani geçerli tanımlayıcı karakterler. +Yollarının en azından bir tür karakter olmalıdır.
  • (...) bir yakalama grubu tanıtır.
  • $ENV{$1}%ENVortam değişkenlerini içeren karma değerini alır . Perl kabuk gibi değişkenleri genişletmez, dolayısıyla değişken /zarar vermeden içerebilir (veya başka bir şekilde).

Örnek:

$ echo '$key' | key=1/2/3/4 perl -pe 's/\$([[:alnum:]]*)/$ENV{$1}/'
1/2/3/4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.