Grep semua string yang tidak dimulai dengan angka

10

Saya mencari grep untuk menampilkan semua karakter yang tidak dimulai dengan angka. Saya telah melakukan sesuatu seperti ini:

grep -v '^[1-2]*[a-zA-Z]?' -o

tapi itu tidak berhasil. Apakah Anda punya ide untuk reg exp?

Paweł Jaworowski
sumber
1
Menggunakan -vdengan -omenyebabkan greptidak menghasilkan output.
cuonglm
Apa yang Anda maksud dengan menunjukkan semua karakter ? Maksud Anda garis yang tidak dimulai dengan angka, atau Anda ingin menghapus semua angka dari input?
Matteo
Secara default, grepgunakan ekspresi reguler dasar . Ini berarti bahwa Anda ?diperlakukan sebagai tanda tanya literal. Entah lolos dari tanda tanya \?, atau gunakan -Eopsi untuk extendedekspresi reguler, dalam hal ?ini adalah karakter pola.
Peter.O
unix.stackexchange.com/questions/60994/…
Ciro Santilli 冠状 病毒 审查 六四 六四 事件 法轮功

Jawaban:

22

grep -v '^[0-9]'

Akan menampilkan semua garis yang tidak ( -v) cocok dengan garis yang dimulai ^dengan angka[0-9]

Sebagai contoh

$ cat test
string
string123
123string
1string2
$ grep -v '^[0-9]' test
string
string123

atau jika Anda ingin menghapus semua kata yang dimulai dengan angka

sed 's/[[:<:]][[:digit:]][[:alnum:]_]*[[:>:]]//g'

atau dengan cara pintas dan pernyataan

sed 's/\<\d\w*\>//g'

Sebagai contoh

$ cat test
one
two2
3three
4four4
five six
seven 8eight
9nine ten
11eleven 12twelve
a b c d
$ sed 's/[[:<:]][[:digit:]][[:alnum:]_]*[[:>:]]//g' test
one
two2


five six
seven 
 ten

a b c d
Matteo
sumber
@ mikeserv mengapa? Ini menghapus setiap kata yang dimulai dengan angka (seperti yang mungkin ditanyakan dalam pertanyaan asli)
Matteo
1
Tidak berhasil. Berakhir pada OS X (dan mungkin BSD lainnya) \> dan \ <tidak berfungsi. Untuk alasan ini saya menyebutkan kedua versi. Dan saya harus menggunakan yang jelek di mesin saya sebagai contoh.
Matteo
Dari halaman manual \> Matches the null string at the end of a word. This is equivalent to [[:>:]] '. `
Matteo
3

Tergantung bagaimana Anda mendefinisikan string (misalnya jika Anda menghitung karakter tanda baca ke string atau tidak). Namun demikian Anda dapat mulai dari sesuatu seperti

grep -Po '\b[^[:digit:]].*?\b' file
jimmij
sumber
2

Untuk menghapus semua kata dari baris yang diawali dengan angka, sedAnda dapat melakukannya:

sed 'x;s/.*//;G
     s/[[:space:]][[:punct:]]\{0,1\}[0-9][^[:space:]]*//g
     s/\n//'

... atau, jika Anda hanya menginginkan kata-kata yang tidak dimulai dengan angka yang dicetak masing-masing pada baris terpisah:

sed 'y/!\t "'"'?/\n\n\n\n\n\n/;/^[_[:alpha:]]/P;D"

... di atas seharusnya cukup baik. Anda ingin menyesuaikan terjemahan \newline y///untuk pembagi yang menurut Anda relevan. Dan, sedimplementasi tergantung, Anda mungkin juga ingin aktual <tab>di tempat \tbackslash melarikan diri.

mikeserv
sumber
@don_crissti - Oh, yeah - Aku akan menempatkan bahwa !menjelang '"'swap, tetapi jika Anda menggunakan bashAnda mungkin ingin set +Hatau jika zshkemudian set -K. Menurut pendapat saya, setiap !ekspansi yang dikutip adalah kegilaan. Anda juga dapat menggunakan heredocs seperti "${0#-}" <<\CMD\nyour cmd strings\nCMD\nuntuk mendapatkan perilaku yang ditulis dalam shell interaktif.
mikeserv
Terima kasih atas "${0#-}" <<...tipnya!
don_crissti
@don_crissti - Jika Anda menggunakan "${0#-}" -s -- arg list <<\CMD\n...Anda juga dapat mengatur parameter posisi saat doa. Menggunakan "$@"atau *sering bermanfaat bagi saya sebagai gantinya arg list. Dan dengan ln -s "$(command -v "${0#-}")" /tmp/new_name; cd tmp; new_name <<\CMD\n...Anda bisa mendapatkan $0stdin baru dan masih menangani.
mikeserv