Bash'de bir dizeden çıkma komutu


103

Bir dizgeyi kaçan bir şeye dönüştürecek bir bash komutuna ihtiyacım var. İşte bir örnek:

echo "hello\world" | escape | someprog

Escape komutunun "hello\world"devreye girdiği yer "hello\\\world". Sonra, bir eprog "hello\\world"beklediği gibi kullanabilir . Elbette, bu gerçekten ne yapacağıma dair basitleştirilmiş bir örnek.


5
Kaçışın doğası nedir? Başka bir deyişle, hangi karakterlerden kaçılması gerekiyor? C ++ tarzı bir kaçış mı arıyorsunuz (sekmelerin yerine \ t, yeni satırlar \ n ile, alıntılar \ "ile değiştirilir, vb.)? Sorun iyi tanımlanmadan yardımcı olmak zor.
Michael Aaron Safyan


Bu soru, bir düzine farklı anlama gelebilir. Bizi tahmin ettirmek yerine, tam olarak ne tür bir kaçış aradığınızı belirtmeniz yardımcı olacaktır.
Don Hatch

1
Soru, \\ for \ kullanımına özeldi. Kabul edilen bir cevap var.
Kullanıcı 1

Yanıtlar:


159

Bash'de:

printf "%q" "hello\world" | someprog

Örneğin:

printf "%q" "hello\world"
hello\\world

Bu, değişkenler aracılığıyla da kullanılabilir:

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

6
Unutmayın, %qyaklaşık 2012 yılına kadar on yıldan fazla bir süredir bozuktu ~. Sorunları vardı . Ayrıca taşınabilir sed tek astarlı stackoverflow.com/a/20053121/1073695
Jo So

1
sed gerçekten daha iyi çünkü dolar işaretlerinden de kaçabilir
2016

2
@untore: (dolar işareti atlanır) ile a='abc$def":'; printf '%q\n' "$a"sonuçlanır abc\$def\":. Bu Bash 4.3 (Bash 3.2'de de aynı sonucu aldım). Hangi sürümü kullanıyorsunuz?
sonraki duyuruya kadar duraklatıldı.

3
dolar işaretinden kaçmak için bunun yerine tek tırnak kullanın, örneğin:printf "%q" 'he$l&lo\world'
LeandroCR

bash printf '%q\n' text, metni bashformatta (ve mevcut yerel ayar için) alıntılar , böylece sadece OP'nin durumunda , pek olası olmayan someprogaynı alıntı sözdizimine sahipse işe yarar bash.
Stephane Chazelas

9

Pure Bash, parametre ikamesi kullanın:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

1
bu şekilde "merhaba dünya" "merhaba \ dünya" ya kaçmaz - kabul edilen yanıtta printf yaklaşımı bunu yapar.
vchrizz

1
Ayrıca, "% q", "03/25/2017" de olduğu gibi "/" çıkış yapmıyor ve "03 \ / 25 \ / 2017" konumuna kaçmam gerekiyordu (böylece "/" ile ayrılmış bir normal ifade).
wrlee

0

Perl'i çeşitli karakterleri değiştirmek için kullanabilirsiniz, örneğin:

$ echo "Hello\ world" | perl -pe 's/\\/\\\\/g'
Hello\\ world

Kaçışınızın niteliğine bağlı olarak, uygun karakterlerden kaçmak için birden fazla çağrı yapabilirsiniz.


1
Neden sed değil? $ echo "merhaba \ dünya" | sed 's / \\ / \\\\ /'
Uzay

1
@Octopus, bu da geçerli bir seçenektir. Perl ile daha rahat oluyorum, ama evet, bu da işe yarıyor.
Michael Aaron Safyan
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.