Cetak semua garis yang tidak mengandung tanda baca

8

Saya ingin pola regex yang dapat mencetak semua baris yang tidak mengandung tanda baca:

Memasukkan :

.This is line 1
This is ! line 2
This is line (3)
This is line 4

Output: (harus)

This is line 4

Apa yang saya coba sejauh ini:

grep '[^[:punct:]]' file.txt

Tapi itu menunjukkan semua karakter yang bukan tanda baca.

Hamed Kamrava
sumber

Jawaban:

11

Anda grepmencetak semua baris yang mengandung karakter non-tanda baca. Itu tidak sama dengan mencetak semua baris yang tidak mengandung karakter tanda baca.

Untuk yang terakhir, Anda menginginkan -vsakelar (garis cetak yang tidak cocok dengan pola):

grep -v '[[:punct:]]' file.txt

Jika, karena alasan tertentu Anda tidak ingin menggunakan -vsakelar, Anda harus memastikan bahwa seluruh baris terdiri dari karakter non-tanda baca:

grep '^[^[:punct:]]\+$' file.txt
Joseph R.
sumber
+1 terima kasih. Apakah ada cara tanpa menggunakan -vsakelar?
Hamed Kamrava
@HamedKamrava Ya. Silakan lihat edit saya.
Joseph R.
@HamedKamrava Karena penasaran: mengapa Anda ingin menghindari -v?
Bernhard
Saya tidak menghindari -vhanya ingin tahu lebih banyak :)
Hamed Kamrava
@HamedKamrava Tolong jangan lupa untuk menandai jawaban ini 'Diterima' jika itu memecahkan masalah Anda.
Joseph R.
1

Sed sed Anda dapat melakukan sesuatu seperti:

sed '/[[:punct:]]/!d'

Dalam awk Anda dapat melakukan:

awk '!/[[:punct:]]/'

ryekayo
sumber
1

A Perlyang:

perl -nle 'print unless /\p{XPosixPunct}/' file

Ini akan cocok dengan -! "# $% & '() * +,. / :; <=>? @ [\] ^ _` {|} ~ Yang unicode mempertimbangkan Punctutation dan Symbols.

atau:

perl -nle 'print unless /\p{Punct}/' file

\p{Punct}hanya cocok -! "#% & '() *,. /:; @ @ [\] _ {} , tidak ada $ + <=> ^` | ~ yang unicode menganggap Simbol.

perlsecara default gunakan lokal POSIX. Jika Anda tidak menggunakan perl, Anda harus menyetel semuanya LC_ALL=POSIX, karena lokal yang berbeda dapat memiliki karakter tanda baca yang berbeda seperti yang SAA Cdimiliki ¢.

cuonglm
sumber