Saya sedang menulis skrip, saya ingin memeriksa apakah baris pertama file cocok dengan pola tertentu dan jika tidak maka cetak file tersebut. Bagaimana saya bisa mencapai ini?
Bagaimana saya memeriksa polanya? Apakah ada cara untuk memeriksa pola dan berdasarkan pada output melakukan sesuatu ..
EDIT: Silakan lihat pertanyaan ini: /programming/5536018/how-to-get-match-regex-pattern-using-awk-from-file
Saya menginginkan sesuatu seperti ini, tetapi tidak ada yang bekerja untuk saya. Saya pada dasarnya ingin memeriksa apakah baris pertama cocok dengan pola regex atau tidak dan berdasarkan itu mencetak baris file.
Jawaban:
Anda dapat melakukannya dengan
ed
:Kuncinya di sini adalah mencoba mengganti
PATTERN
on1st
line dengan dirinya sendiri.ed
akan kesalahan jika tidak menemukan pola yang ditentukan sehingga,p
(cetak seluruh file) hanya akan dieksekusi jika1s/PATTERN/&/
berhasil.Atau dengan
sed
:ini
q
berlaku jika baris pertama tidak (!
) cocokPATTERN
, jika tidak maka akanp
merusak semua baris.Atau, seperti yang ditunjukkan oleh Toby Speight , dengan GNU
sed
:Q
sama sepertiq
tetapi tidak mencetak ruang pola.sumber
Q
bukannyaq
untuk GNU sed, ataud
sebelumnyaq
(portable) agar tidak memerlukan-n
flag danp
perintah:sed '1{/PATTERN/!Q}' infile
ataused -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infile
, masing-masing.d
restart siklus perintah Itu selalu menarik saya keluar! : - |sed
,sed
perintah pertama mengeluhsed: -e expression #1, char 10: extra characters after command
(karenap
), tetapi saraned
dan terakhirsed
berfungsi dengan baik.sed -n '1{/PATTERN/!q};p'
Dengan dada alat POSIX:
sumber
akan mencetak nama non-tersembunyi
txt
file dalam direktori saat ini yang baris pertama cocok dengan ekspresi reguler diperpanjangpattern
dengan orang-orangawk
inplementations bahwa dukungannextfile
.Jika alih-alih mencetak nama file, Anda ingin mencetak seluruh konten file, Anda dapat melakukan:
Itu efisien karena hanya menjalankan satu perintah, tetapi
awk
bukan perintah yang paling efisien untuk membuang konten file, dengan file besar, Anda mungkin bisa mendapatkan kinerja yang lebih baik dengan melakukan sesuatu seperti:Artinya, hanya digunakan
awk
untuk mencetak daftar file yang cocok (dibatasi 0) dan mengandalkancat
untuk membuang konten mereka.sumber
Jika Anda menulis skrip shell, Anda dapat melakukannya seperti ini
Atau, dalam Perl:
sumber
close ARGV
lebih idiom daripada menugaskan$.
.Oldschool, cukup terjemahkan kalimat Anda ke perintah standar:
Untuk mempelajari bash, itu adalah awal yang baik. Jika Anda hanya membutuhkan solusi cepat, coba jawaban sed, awk- atau perl. Keduanya bagus, tetapi mereka adalah bahasa sendiri yang Anda perlu (dan mungkin ingin) pelajari.
Ini adalah contoh yang cukup sederhana, jadi jika Anda ingin mempelajari lebih lanjut, Anda juga dapat mencoba hal yang sama di ruby, php, js (misalnya dalam nodejs) atau bahasa lain yang memungkinkan akses file. Bahkan C / C ++ atau Java harus mudah dikelola dengan tugas kecil.
sumber
if/else
bukan[ ] &&
.