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'
Mike
sumber

Jawaban:

465

Menggunakan:

grep -- -X

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

berita baru
sumber
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.

Chad Gorshing
sumber
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.

Thomas
sumber
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
John Henry
sumber
7

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

ezpz
sumber
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.

fmmarques
sumber
3

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

'[-]X'
Colin vH
sumber
2

Anda bisa menggunakan nawk

$ nawk '/-X/{print}' file
ghostdog74
sumber
-1
ls -l | grep "^-"

Semoga yang ini melayani tujuan Anda.

XINU
sumber
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
-1

grep "^ -X" file

Itu akan grep dan memilih semua baris dari file. ^ dalam grep "^" menunjukkan baris yang dimulai dengan

sasank
sumber
1
Sudah ada jawaban yang menyarankan bahwa stackoverflow.com/a/27440348/441757 (diposting lebih dari setahun yang lalu)
sontonbarker
OP mencari string yang dimulai dengan -, bukan garis.
codeforester