Saya punya string, misalnya
"Icecream123 AirplaneBCD CompanyTL1 ComputerYU1"
Katakanlah saya tahu bahwa string saya akan berisi IceCream substring pasti tapi saya tidak tahu apa yang mengikutinya.
Mungkin 123 seperti dalam contoh saya atau mungkin sesuatu yang berbeda.
Sementara saya bisa menggunakan grep untuk mendeteksi apakah "Icecream" substring ada di string saya dengan perintah berikut
echo $string | grep -oF 'Icecream';
Yang akan dicetak
Icecream
Saya ingin dengan perintah untuk mencetak seluruh substring, yang dalam contoh saya adalah
Icecream123
Tentu saja yang mengikuti Icecream adalah acak dan tidak diketahui sebelumnya jadi saya tidak bisa begitu saja melakukannya
$SUBSTRING=$(echo $string | grep -oF 'Icecream')
$SUBSTRINGTRAIL=123
echo $SUBSTRING$SUBSTRINGTRAIL
bash
shell-script
grep
Sonamor
sumber
sumber
Icecream123 AirplaneBCD
Anda ingin berhenti123
. Apakah itu karena ada spasi setelah angka 3, atau yang lainnya?Jawaban:
Jika Anda
grep
mendukung perl ekspresi reguler yang kompatibel, Anda dapat mencocokkan non-rakus hingga batas kata berikutnya:Jika tidak, cocok dengan urutan karakter non-kosong terpanjang:
Atau simpan semua yang ada di shell dan hapus urutan karakter terpanjang yang dimulai dengan spasi:
sumber
'Icecream\S+'
beberapa karakter yang tidak kosong.Menggunakan
grep
yang tahu tentang-o
:Pola
\<Icecream[^[:blank:]]*
cocok dengan stringIcecream
(di manaI
didahului oleh karakter non-kata, atau awal baris) diikuti oleh nol atau lebih non-kosong (bukan spasi atau tab).Menggunakan
awk
:The
awk
Program membagi string menjadi catatan ruang yang dipisahkan, dan tes masing-masing. Ini akan mencetak yang dimulai dengan stringIcecream
.Menggunakan
mawk
atau GNUawk
, Anda juga dapat menggunakankarena mereka interpet
RS
sebagai ekspresi reguler jika mengandung lebih dari satu karakter.Dengan
sed
, dengan cara yang sama seperti dengangrep
:Menggunakan
/bin/sh
:Perl (dengan sedikit bantuan dari
tr
):atau hanya
sumber
echo "$string" | grep -o '\S\+' | grep "Icecream"
Karena Anda memberi tag pada bash:
Secara umum, untuk istilah pencarian di
$search
:... atau dengan ekspansi parameter:
sumber
Misalnya, jika Anda menggunakan
GNU grep
:Itu menggunakan
PCRE
.sumber
Mungkin sedikit lebih sederhana, terutama karena Anda mengatakan bahwa versi grep Anda tidak mendukung perl regex:
$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123
The
tr
membagi string ke dalam garis dengan mengganti semua ruang dengan baris baru. Maka Anda bisa menggunakannyagrep
dengan mudah.Anda juga dapat menulis yang berikut ini untuk mendapatkan hanya apa yang mengikuti kata yang Anda cari:
$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123
sumber