Menggunakan grep + sed
Ini akan mem-parsing isi dari 2 string:
$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2
Di atas mencari string yang cocok dengan pola ".*"
. Itu akan cocok dengan apa pun yang terjadi dalam tanda kutip ganda. Jadi grep
akan mengembalikan jenis nilai ini:
"arch"
"arch2"
Pipa untuk sed
akan menghapus setiap tanda kutip ganda dari string ini memberikan Anda string yang Anda cari. Notasi sed 's/"//g'
ini menginstruksikan sed
untuk melakukan pencarian dan mengganti semua kemunculan tanda kutip ganda, menggantikannya dengan apa pun s/"//g
,. Perintahnya s/find/replace/g
adalah apa yang terjadi di sana, dan trailing g
to search menyuruhnya melakukannya secara global pada seluruh string yang diberikan.
Hanya menggunakan sed
Anda juga dapat menggunakan sed
untuk memangkas kuotasi awal, menyimpan apa yang ada di antara keduanya, dan memangkas kuotasi yang tersisa + semua yang ada setelahnya:
$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2
Metode lainnya
$ grep -o '".*"' somefile | tr -d '"'
arch
arch2
Perintah tr
dapat digunakan untuk menghapus karakter. Dalam hal ini menghapus tanda kutip ganda.
$ grep -oP '(?<=").*(?=")' somefile
arch
arch2
Dengan menggunakan grep
fitur PCRE, Anda dapat mencari substring yang dimulai dengan penawaran ganda atau diakhiri dengan penawaran ganda dan melaporkan hanya substring tersebut.
tr -d \"
adalah cara lain untuk menghapus tanda kutip. (tr
biasanya menerjemahkan satu set karakter ke yang lain;-d
/address/
untuksed
sepertised '/^"\(arch[^"]*\)/s//\1/
Anda hanya akan beroperasi pada baris yang mengandung string.sed
benar-benar harus melakukans/^"\([^"]*\)".*/\1/
kalau-kalau ada hanya dua tanda kutip ganda di telepon.Itu pekerjaan lain untuk
cut
:sumber
cut
membagi setiap baris menjadi bidang-bidang menggunakan tanda kutip sebagai pembatas, kemudian menghasilkan bidang 2: bidang 1 adalah string kosong sebelum kutipan pertama, bidang 2 adalah string yang dicari antara tanda kutip, dan bidang 3 adalah sisa dari baris.Dengan
sed
Anda dapat melakukan:Penjelasan:
s/.../.../
- cocok dan ganti^
- cocok pada awal baris\(...\)
- ini adalah referensi belakang, kita dapat merujuk pada apa yang cocok di sini nanti dengan\1
[^"]*
- cocok dengan urutan apa pun yang tidak mengandung"
(yaitu hingga yang berikutnya"
).*
- cocok dengan sisa baris\1
- ganti dengan referensi belakangAtau dengan
awk
:Perhatikan bahwa dalam shell modern Anda juga dapat menggunakan array alih-alih variabel normal. Di dalam
bash
kamu dapat melakukan:Ini mungkin lebih mudah ketika Anda datang untuk menggunakan variabel.
sumber
Menggunakan bash, saya akan menulis:
sumber
Dan satu melalui grep oneliner dengan
--perl-regexp
opsi,Penjelasan:
(?<=^\")[^"]*
-> Pandangan di belakang digunakan di sini. Ini cocok dengan karakter apa pun tetapi tidak dari"
nol atau lebih kali (setelah itu menemukan tanda kutip ganda, itu berhenti cocok) yang hanya setelah tanda kutip ganda (hanya garis yang dimulai dengan tanda kutip ganda).Peretasan lain yang jelek
sed
,sumber
karena regex memiliki mode serakah dan non-serakah, jika Anda memiliki beberapa target pada baris yang sama, regex tidak akan mengekstraksi seperti yang Anda inginkan. Baris:
Target:
Perintah (mode serakah):
Perintah (mode non-serakah):
sumber