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.