Kısa çizgi / kısa çizgi ile başlayan bir dize için nasıl grep yapabilirim?


347

Ben -Xbir dosyada, tire / tire ile başlayan dize için grep istiyorum , ama bu komut satırı argümanı olarak kafa karıştırıcı.

Denedim:

grep "-X"
grep \-X
grep '-X'

Yanıtlar:


465

kullanın:

grep -- -X

İlgili: Çıplak çift çizgi ne anlama geliyor? ( natty hakkında ceviz sayesinde ).


57
Bu aşamada ne --anlama geldiğini veya ne anlama geldiğini merak edenler için : unix.stackexchange.com/questions/11376/…
natty hakkında ceviz

2
Silver Searcher (ag) ile de çalışır.
Zev Eisenberg

Değişkenlere sahip boşluklarla kullanmak istiyorsanız, şöyle bir şey kullanmalısınız:ARGS="-a -b -c" grep -- "$ARGS"
zapstar

2
@zapstar Veya sadece grep -- "--name awesome".
Brett Widmeier

@BrettWidmeier, evet, değişkeni kullanmamalıydım, insanların kafasını karıştırıyor.
zapstar

57

Kısa çizgi Bash'te http://tldp.org/LDP/abs/html/special-chars.html#DASHREF adresinde belirtildiği gibi özel bir karakterdir . Yani bundan bir kez kaçmak sizi Bash'ın yanından geçirir, ancak Grep hala tire (seçenek sunarak) için kendi anlamına sahiptir.

Bu yüzden gerçekten iki kez kaçmanız gerekiyor (belirtilen diğer cevapları kullanmamayı tercih ediyorsanız). Aşağıdaki çalışır / çalışmalıdır

grep \\-X
grep '\-X'
grep "\-X"

Bash'in bir betik / programa nasıl argüman aktardığını denemenin bir yolu, tüm argümanları yansıtan bir .sh betiği oluşturmaktır. Ben zaman zaman oynamak için echo-args.sh adlı bir komut dosyası kullanın, tüm içerir:

echo $*

Ben şöyle çağırıyorum:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

Kaptın bu işi.


1
Bilmiyorum - ABS kılavuzunun söylediklerine rağmen Bash'te özel bir karakter. Bash, diğerlerinden farklı olarak ile başlayan argümanları işlemez. Bash'ın daha sonra çağıracağı komut ya da yerleşik, tire işareti ile başlayan ancak uygun gördüğü argümanları işleyecektir. Bash yerleşiklerinin ve Linux ve GNU komutlarının çoğu, seçenek sonlandırıcı olarak kullanılır. Bash'in yürütülmeden önce kullandığı komutları ve bağımsız değişkenleri görmek için, ancak Bash kaçışları, glob'ları ve kaşlı ayraçları genişlettikten sonra 'set -x'i kullanın. Grep kafa karıştırıcı bir örnektir, çünkü ters eğik çizgi kaçışlarını kendi idare eder.
Noah Spurrier

25

grep -e -X hile yapacak.


1
grep'im -e, çok garip değil
Mike

14
kaybetmek için solaris
Mike

2
/ Usr / xpg4 / bin / grep, btw adresinden solaris'te kullanılabilir. Bu dizinde çok daha fazla yardımcı program var.
pra

MinGW altında çalıştı ( MinGW desteklemiyor -P(ancak bu başka bir hikaye ve burada geçerli değil)).
Peter Mortensen


20
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X

7

Bir Solaris makinesine erişimim yok, ancak grep "\-X"benim için linux'da çalışıyor.


5

Doğru yol, daha önce de belirtildiği gibi, bağımsız değişkenleri işlemeyi durdurmak için "-" kullanmaktır. Bunun nedeni, aracın kaynağında getopt_long (getopt.h dosyasından GNU C işlevi) kullanılmasıdır.

Bu yüzden aynı fenomeni diğer komut satırı araçlarında fark edersiniz; çoğu GNU aracı olduğundan ve bu çağrıyı kullandığından, aynı davranışı sergilerler.

Bir yan not olarak - getopt_long bize -rlo ve --really_long_option ve yorumlayıcıdaki argümanların birleşimi arasında harika bir seçim sunar.


3

Grep'e tek bir argüman ileten başka bir yardımcı program kullanıyorsanız şunları kullanabilirsiniz:

'[-]X'


-1
ls -l | grep "^-"

Umarım bu sizin amacınıza hizmet eder.


2
Bu ifade yalnızca tire işareti ile başlayan satırları yakalar. İlk soruya uymuyor. Bir tire ile başlayan bir dize aramak ister, ancak bu dizeyi içeren satırlar bir tire ile başlamaz. İlk soruda, tire ile başlayan dize çizginin herhangi bir yerinde olabilir.
Laurent Simon

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.