Bagaimana saya bisa mendapatkan string yang dimulai dengan tanda hubung / tanda hubung?


347

Saya ingin grep untuk string yang dimulai dengan tanda hubung / tanda hubung, seperti -X, dalam file, tapi ini membingungkan sebagai argumen baris perintah.

Saya sudah mencoba:

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

Jawaban:


465

Menggunakan:

grep -- -X

Terkait: Apa arti dasbor ganda telanjang? (Terima kasih banyak tentang natty ).


57
bagi kita bertanya-tanya pada tahap ini apa --artinya atau tidak: unix.stackexchange.com/questions/11376/…
nutty about

2
Bekerja dengan The Silver Searcher (ag) juga.
Zev Eisenberg

Jika Anda ingin menggunakan variabel yang memiliki spasi, Anda harus menggunakan sesuatu seperti ini:ARGS="-a -b -c" grep -- "$ARGS"
zapstar

2
@zapstar Atau adil grep -- "--name awesome",.
Brett Widmeier

@ BrettWidmeier, ya, saya seharusnya tidak menggunakan variabel, itu membingungkan orang.
zapstar

57

Tanda hubung adalah karakter khusus di Bash seperti yang tercantum di http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Jadi lolos dari hal ini hanya membuat Anda melewati Bash, tetapi Grep masih memiliki makna sendiri untuk berlari (dengan memberikan opsi).

Jadi Anda benar-benar perlu menghindarinya dua kali (jika Anda memilih untuk tidak menggunakan jawaban yang disebutkan lainnya). Berikut ini akan / harus berfungsi

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

Salah satu cara untuk mencoba bagaimana Bash meneruskan argumen ke skrip / program adalah dengan membuat skrip .sh yang hanya menggemakan semua argumen. Saya menggunakan skrip yang disebut echo-args.sh untuk bermain dari waktu ke waktu, semua isinya adalah:

echo $*

Saya menyebutnya sebagai:

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

Anda mendapatkan idenya.


1
Saya tidak berpikir - adalah karakter khusus di Bash meskipun apa yang dikatakan panduan ABS. Bash tidak memproses argumen yang dimulai dengan - berbeda dari yang lain. Perintah atau built-in yang Bash selanjutnya panggil akan menangani argumen yang diawali dengan tanda hubung namun sesuai. Sebagian besar built-in Bash dan Linux dan GNU menangani - sebagai terminator pilihan. Gunakan 'set -x' untuk melihat perintah dan argumen yang digunakan Bash sebelum dieksekusi, tetapi setelah Bash meluas lolos, gumpalan, dan kawat gigi. Grep adalah contoh yang membingungkan karena ia melakukan penanganan backslash sendiri.
Noah Spurrier

25

grep -e -X akan melakukan trik.


1
grep saya tidak punya -e, sangat aneh
Mike

14
solaris untuk yang kalah
Mike

2
Tersedia di solaris dari / usr / xpg4 / bin / grep, btw. Banyak utilitas yang lebih lengkap di direktori itu.
pra

Ini berfungsi di bawah MinGW ( MinGW tidak mendukung -P(tapi itu cerita lain dan tidak berlaku di sini))
Peter Mortensen


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

7

Saya tidak memiliki akses ke mesin Solaris, tetapi grep "\-X"bekerja untuk saya di linux.


5

Cara yang benar adalah dengan menggunakan "-" untuk menghentikan pemrosesan argumen, sebagaimana telah disebutkan. Ini disebabkan oleh penggunaan getopt_long (fungsi-GNU dari getopt.h) di sumber alat.

Inilah sebabnya mengapa Anda memperhatikan fenomena yang sama pada alat baris perintah lainnya; karena kebanyakan dari mereka adalah alat GNU, dan menggunakan panggilan ini, mereka menunjukkan perilaku yang sama.

Sebagai catatan tambahan - getopt_long adalah yang memberi kita pilihan keren antara -rlo dan --really_long_option dan kombinasi argumen dalam interpreter.


3

Jika Anda menggunakan utilitas lain yang melewati satu argumen untuk di-grep, Anda dapat menggunakan:

'[-]X'


-1
ls -l | grep "^-"

Semoga yang ini melayani tujuan Anda.


2
Ekspresi ini hanya menangkap garis yang dimulai dengan tanda hubung. Itu tidak sesuai dengan pertanyaan awal. Dia ingin mencari string yang dimulai dengan tanda hubung tetapi garis yang berisi string ini tidak perlu dimulai dengan tanda hubung. Pada pertanyaan awal, string yang dimulai dengan tanda hubung dapat berada di mana saja dalam baris.
Laurent Simon

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.