Xargs neden alıntıları girdiden alıyor?


25

Xargs neden alıntıları giriş metninden alıyor?

İşte basitleştirilmiş bir örnek:

echo "/Place/='http://www.google.com'" | xargs echo

çıktılar

/Place/=http://www.google.com

Bu konuyu çözmenin bir yolu var mı? (xargs -0 bana yardım etmiyor)


1
xargstırnak ve ters eğik çizgi özel olarak spec bir parçası olarak davranır . Onunla ne yapmaya çalıştığını yayınla xargs.
jw013

3
xargs -0burada benim için çalışıyor ... Neden sana yardım etmiyor?
derobert

Yanıtlar:


10

Gönderen xargsmanuel:

Bir giriş bağımsız değişkeninin boşluklar veya yatay sekmeler içermesini istiyorsanız, onu çift tırnak veya kesme işareti içine alın. Bağımsız değişken bir çift alıntı karakteri ( ") içeriyorsa , bağımsız değişkeni kesme işareti içine almanız gerekir. Tersine, eğer bir argüman bir kesme işareti ( ') içeriyorsa , argümanı çift tırnak işareti içine almalısınız. Ayrıca \, karakterin sahip olabileceği herhangi bir özel anlamı (örneğin, beyaz boşluk karakterleri veya tırnak işaretleri) yoksaymasını söylemek için bir karakterin önüne ters eğik çizgi ( ) ekleyebilirsiniz .

Bu, eğer alıntılar kendilerine alıntı yapılıyorsa alıntılardan kaçabileceğiniz anlamına gelir:

$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'

çalışacak ama çalışmayacak echo /Place/=\'http://www.google.com\' | xargs echo.


1
Aşağı oylara karşı bir şey yok, ancak sebebi üzerine bir yorum yardımcı olur :-)
Matteo

3
Ya girişte boru kullanıyorsanız? Çıktı yapan bir betiğim varsa "/Place/='http://www.google.com'", düzgün bir şekilde nasıl kurtulabilirim?
Roger Filmyer 7:15

1
@RogerFilmyer Instagram Hesabındaki Resim ve Videoları your_script | paralel - yazı tipi | ...
Ole Tange

19

İstersen xargsiçin Tırnakları görmezden kullanılması olabilir iyi soultion birini xargsbayrak xargs -0

Doğrudan Man sayfasından SEÇENEKLER

SEÇENEKLER -0, --null

Girdi öğeleri boşluk ile değil, boş bir karakterle sonlandırılır ve tırnak işaretleri ve ters eğik çizgi özel değildir (her karakter tam anlamıyla alınır). Diğer bağımsız değişkenler gibi işlenen dosya dizesinin sonunu devre dışı bırakır. Giriş öğeleri beyaz boşluk, alıntı işaretleri veya ters eğik çizgiler içerdiğinde kullanışlıdır. GNU find -print0 seçeneği bu mod için uygun girdiler üretir.

Sınırlayıcının -dseçeneği ( yeni satır gibi) belirli bir değere (yeni satır gibi) ayarlanmasının (sadece değil -0) aynı zamanda xargstırnaklara vb.

-bash-4.3$ { echo "a'b'c"; echo d; } | xargs -d$'\n' echo
a'b'c d
-bash-4.3$ rpm -qf "$(which xargs)"
findutils-4.6.0.0.99.11a05-alt1.x86_64
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs echo
abc d
-bash-4.3$ 


7

Manpage'de başka bir çözüm buldum: açıkça sınırlayıcıyı '\ n' olarak belirtin. Bu, alıntılar için özel işlemeyi kapatır:

--delimiter = delim, -d delim

Girdi öğeleri belirtilen karakterle sonlandırılır. Belirtilen sınırlayıcı tek bir karakter, \ n gibi bir C tarzı karakter çıkış veya bir sekizli veya onaltılık çıkış kodu olabilir. Sekizli ve onaltılık çıkış kodları printf komutunda olduğu gibi anlaşılır. Çok baytlı karakterler desteklenmiyor. Girdi işlenirken, tırnak işaretleri ve ters eğik çizgi özel değildir; Girişteki her karakter tam anlamıyla alınır.

Yani,

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

çıktılar

/Place/='http://www.google.com'

GNU xargsveya uyumlu olduğunu unutmayın
Stéphane Chazelas

Ayrıca, boşluğun ve sekmenin sınırlayıcı olarak tanınmasını da engellediğine dikkat edin (muhtemelen OP'nin durumunda da).
Stéphane Chazelas,

Balman benzer bir çözüm ( aslında @ imz ) verdi, ancak sizinki daha iyi olmasına rağmen ksh93 $'...', her kabuk uygulamasında bulunmayan alıntı operatörünün kullanılmasını önlüyor .
Stéphane Chazelas

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.