Saya perlu mencari jika ada baris dalam file yang dimulai **
.
Saya tidak tahu bagaimana melakukannya karena *
ditafsirkan sebagai wildcard oleh shell.
grep -i "^2" test.out
berfungsi jika garis dimulai dengan 2 tetapi
grep -i "^**" test.out
jelas tidak bekerja.
(Saya juga perlu tahu apakah baris ini berakhir dengan )
tetapi belum mencobanya).
text-processing
grep
quoting
Shar Hunter
sumber
sumber
*
tidak perlu melarikan diri dalam kasus khusus ini, fwiw.grep "^\\*\\*"
sehingga grep menerima^\*\*
string yang perlu dihindari menafsirkan tanda bintang sebagai regex quantifiers.Karena Anda ingin memeriksa garis yang dimulai
**
dan diakhiri dengan)
, Anda dapat menggabungkan duagrep
operasi seperti ini,Atau dengan satu
grep
perintah seperti ini,Penjelasan
^\*\*
: garis kecocokan yang dimulai dengan**
.*
: cocokkan semuanya setelah**
\)$
: garis pertandingan yang juga ada)
di akhir baris.sumber
Itu bukan cangkangnya
Sejauh ini tidak ada jawaban yang menyentuh masalah sebenarnya. Akan sangat membantu untuk menjelaskan mengapa itu tidak bekerja seperti yang Anda harapkan.
grep -i "^**" test.out
Karena Anda telah dikutip pola untuk grep ,
*
yang tidak diperluas oleh shell. Itu dilewatkan untuk memahami apa adanya. Ini dijelaskan di halaman manual [1] untuk bash [2] :Ini ekspresi reguler biasa biasa
Ekspresi reguler adalah pola yang menggambarkan sekumpulan string.
*
adalah salah satu pola utama dalam ekspresi reguler. Secara default, grep mengartikannya sebagai berikut:Ini berarti bahwa pola Anda seperti apa adanya,
^**
tidak masuk akal. Mungkin itu mencoba untuk mencocokkan awal garis nol atau lebih , dua kali. Apapun maksudnya.Solusinya adalah mengutipnya :
grep -i "^\*\*" test.out
[1] Saya tidak merekomendasikan membacanya. Silakan gunakan
man dash
atau serupa.[2] Tidak ada shell yang diberikan, jadi saya berasumsi bash .
sumber
Pilihan lain.
Anda bisa menggunakan
sed
atauawk
jugaUntuk mengetahui garis yang diakhiri dengan
)
gunakan jugagrep
ataused
atauawk
sumber
'/^*\*/&&/)$/'
...Ini adalah versi sepenuhnya kuotasi:
grep ^\\*\\* test.out
. Untuk melewatkan backslash literal dari shell ke grep, ia harus diloloskan.Ini berfungsi selama Anda tidak memiliki file di direktori dimulai dengan
^\
dan mengandung backslash lain.sumber