Contoh string saya adalah sebagai berikut:
This is 02G05 a test string 20-Jul-2012
Sekarang dari string di atas saya ingin mengekstrak 02G05
. Untuk itu saya mencoba regex berikut dengan sed
$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'
Tetapi perintah di atas tidak mencetak apa pun dan alasan saya yakin adalah tidak dapat mencocokkan apa pun dengan pola yang saya berikan ke sed.
Jadi, pertanyaan saya adalah apa yang saya lakukan salah di sini dan bagaimana memperbaikinya.
Ketika saya mencoba string dan pola di atas dengan python, saya mendapatkan hasil saya
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
sed
. Rasa regex mereka sangat berbeda.Jawaban:
Polanya
\d
mungkin tidak didukung oleh Andased
. Coba[0-9]
atau[[:digit:]]
sebagai gantinya.Untuk hanya mencetak pertandingan yang sebenarnya (bukan seluruh baris yang cocok), gunakan substitusi.
sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'
sumber
.*
perlu dengan regex Anda karena ketika saya mencobanyased -n 's/\([0-9]\+G[0-9]\+\)/\1/p'
hanya mencetak seluruh baris.2G05
tidak02G05
. Ekspresi yang berhasil adalah's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'
itu lebih umum. (Saya berasumsised
dukungan Anda\?
untuk nol atau satu kejadian.)\w
,\s
, dllBagaimana kalau menggunakan
grep -E
?echo "This is 02G05 a test string 20-Jul-2012" | grep -Eo '[0-9]+G[0-9]+'
sumber
sed
Skrip yang rumit dapat dibuat untuk kasus itu, tetapi mengapa repot-repot?egrep
menggunakan regexp diperpanjang,sed
dangrep
menggunakan regexp standar,egrep
ataugrep -e
ataused -E
menggunakan regexp diperpanjang, dan kode python dalam pertanyaan menggunakan PCRE, (perl ekspresi reguler umum) GNU grep dapat menggunakan PCRE dengan-P
opsi.egrep
ataugrep -E
ataused -r
grep
harus-m 1
berhenti setelah pertandingan pertama.sed
tidak mengenali\d
, gunakan[[:digit:]]
saja. Anda juga harus keluar dari+
atau menggunakan-r
sakelar (-E
di OS X).Perhatikan bahwa ini juga
[0-9]
berfungsi untuk angka Arab-Hindu.sumber
sed -n '/[0-9]\+G[0-9]\+/p'
. Sekarang hanya mencetak seluruh stringCoba ini sebagai gantinya:
echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'
Tapi perhatikan, jika ada dua pola dalam satu baris, itu akan mencetak yang ke-2.
sumber
Coba gunakan rextract . Ini akan memungkinkan Anda mengekstrak teks menggunakan ekspresi reguler dan memformatnya ulang.
Contoh:
$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}' 2G05
sumber
\d
benar-benar berlebihan.