Bir s
komutun sed
(burada $lhs
ve $rhs
sırasıyla) sol tarafında ve sağ tarafında kullanılacak değişkenlerden kaçmak için şunları yaparsınız:
escaped_lhs=$(printf '%s\n' "$lhs" | sed 's:[][\/.^$*]:\\&:g')
escaped_rhs=$(printf '%s\n' "$rhs" | sed 's:[\/&]:\\&:g;$!s/$/\\/')
sed "s/$escaped_lhs/$escaped_rhs/"
Yeni $lhs
satır karakteri içeremeyeceğini unutmayın .
Yani, LHS'de, tüm normal ifade operatörlerinden ( ][.^$*
), kaçan karakterin kendisinden ( \
) ve ayırıcıdan ( /
) kaçın .
RHS'de, yalnızca &
ayırıcıdan, ayırıcıdan, ters eğik çizgiden ve yeni satır karakterinden (son satır ( $!s/$/\\/
) hariç her satırın sonuna bir ters eğik çizgi ekleyerek yaptığınız) kaçmanız gerekir .
Yani kullandığınız varsayılmaktadır /
senin bir ayırıcı olarak sed
s
komutlar ve etkinleştirmek olmadığını Genişletilmiş RE'lerı ile -r
(GNU sed
/ ssed
/ ast
/ busybox sed
) ya da -E
(BSD, ast
son GNU, son busybox) ya da PCREs ile -R
( ssed
) veya Artırılmış RE'ler ile -A
/ -X
( ast
) hangi hepsinde ekstra RE operatörleri vardır.
Rasgele verilerle çalışırken bazı temel kurallar:
- Kullanma
echo
- değişkenlerini teklif et
- yerel ayarın etkisini düşünün (özellikle karakter kümesi: kaçan
sed
komutların, sed
örneğin kaçan dizeleri (ve aynı sed
komutla) kullanan komutla aynı yerel ayarda çalıştırılması önemlidir.
- yeni satır karakterini unutmayın (burada
$lhs
herhangi bir içerik olup olmadığını kontrol etmek ve işlem yapmak isteyebilirsiniz ).
Başka bir seçenek de , dizeleri ortamın perl
yerine kullanmak sed
ve ortamdan geçirmek ve dizeleri tam anlamıyla almak için \Q
/ \E
perl
regexp işleçlerini kullanmaktır :
A="$lhs" B="$rhs" perl -pe 's/\Q$ENV{A}\E/$ENV{B}/g'
perl
(varsayılan olarak), yerel ayarın karakter kümesinden etkilenmez, çünkü yukarıdaki gibi, dizeleri yalnızca kullanıcı için hangi karakterleri (varsa) temsil edebileceklerini önemsemeden bayt dizileri olarak görür. İle sed
, tüm komutlar için yerel ayarı C
ile sabitleyerek aynı şeyi başarabilirsiniz (ancak bu, varsa hata mesajlarının dilini de etkiler).LC_ALL=C
sed