$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
Telusuri baris yang berisi "POP3_SERVER_NAME"; cetak kolom terakhir. Ini tidak tergantung pada POP3_SERVER_NAME yang selalu menggunakan jalur 3, yang mungkin merupakan Hal yang Baik.
Bergantung pada aplikasi Anda, Anda mungkin perlu membuat ekspresi reguler lebih ketat. Misalnya, Anda mungkin ingin mencocokkan hanya garis yang dimulai dengan POP3_SERVER_NAME.
Menggunakan sed sedikit kurang intuitif. (Terima kasih, saya menyadari ironi ini.) Alamat baris yang berisi POP3_SERVER_NAME di mana saja. Ganti string kosong untuk semua teks dari awal baris ke spasi opsional setelah "=". Lalu cetak.
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
The awkperintah bagus - tetapi hanya jika Anda punya ruang di sekitar =. Itu tidak akan berhasil POP3_SERVER_NAME=localhost.
Marcel Stör
2
@ Marscel, Anda dapat mengubah pembatas yang digunakan oleh awkdari spasi ke yang lain menggunakan -F. Misalnya: -F "="akan menggunakan =sebagai pembatas dalam kasus yang Anda sebutkan.
mattpr
7
Ganti pperintah dengan substitusi yang menghilangkan bagian yang tidak diinginkan dari baris.
sed -n '3 s/^[^=]*= *//p' installation.sh
Anda mungkin ingin mencocokkan baris dengan kata kunci daripada dengan posisi.
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
Sepertinya Anda punya file konfigurasi. Apa yang dapat Anda lakukan mirip dengan apa yang disarankan Adam Siemeon / slm:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
di mana [^=]tidak termasuk semua '=' karakter, +kata salah satu atau lebih dari jenis yang sama dari karakter, ini diikuti oleh yang sebenarnya =, \ssetiap spasi (termasuk tab \tdan baris baru \n, \r\n, dan ruang polos '', sedangkan *berarti nol atau lebih dari jenis yang sama , tanda kurung menangkap apa yang ada di dalam untuk menempatkan urutan karakter yang cocok ke dalam penampung pengganti \ 1, \ 2, ..., \ n, $berarti akhir dari sebuah baris. Ini mengikuti pola penggantian khas:. s/.../.../modifiersOpsi baris perintah -radalah singkatan dari sintaks regex diperpanjang (sebagai masalah kenyamanan) dan -nberarti tidak menghasilkan apa-apa sampai atau kecuali diminta secara eksplisit. pPengubah mencetak hasil.
Anda dapat melakukan pencarian global dengan gpengubah seperti:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
sehingga Anda mendapatkan string dipisahkan oleh ' '(bisa \n, \tatau apa yang harus Anda) yang dapat Anda memproses dengan mudah.
Keduanya valid asalkan nilai Anda didahului oleh rentang karakter persamaan hingga akhir baris dan tidak diikuti oleh komentar atau karakter lain dengan semantik yang menyimpang dari "nilai" sederhana.
Edit:
Saya belum bisa berkomentar di sini tentang posting orang lain. Untuk menunjukkan baris, cukup lewati nomor baris, dalam kasus Anda 3, sebelum satau sebelum tanda kutip yang dimulai (seperti dalam vim).
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
Silakan lihat info sed. Misalnya, 3.2 dan 4.7 menarik bagi Anda.
Keindahan Linux / Unix adalah bahwa biasanya ada lebih dari satu cara untuk mencapai sesuatu. Dalam kasus op, setidaknya ada empat cara berbeda untuk mengekstrak nama server POP dari file:
awk
perintah bagus - tetapi hanya jika Anda punya ruang di sekitar=
. Itu tidak akan berhasilPOP3_SERVER_NAME=localhost
.awk
dari spasi ke yang lain menggunakan-F
. Misalnya:-F "="
akan menggunakan=
sebagai pembatas dalam kasus yang Anda sebutkan.Ganti
p
perintah dengan substitusi yang menghilangkan bagian yang tidak diinginkan dari baris.Anda mungkin ingin mencocokkan baris dengan kata kunci daripada dengan posisi.
sumber
Sepertinya Anda punya file konfigurasi. Apa yang dapat Anda lakukan mirip dengan apa yang disarankan Adam Siemeon / slm:
di mana
[^=]
tidak termasuk semua '=' karakter,+
kata salah satu atau lebih dari jenis yang sama dari karakter, ini diikuti oleh yang sebenarnya=
,\s
setiap spasi (termasuk tab\t
dan baris baru\n
,\r\n
, dan ruang polos '', sedangkan*
berarti nol atau lebih dari jenis yang sama , tanda kurung menangkap apa yang ada di dalam untuk menempatkan urutan karakter yang cocok ke dalam penampung pengganti \ 1, \ 2, ..., \ n,$
berarti akhir dari sebuah baris. Ini mengikuti pola penggantian khas:.s/.../.../modifiers
Opsi baris perintah-r
adalah singkatan dari sintaks regex diperpanjang (sebagai masalah kenyamanan) dan-n
berarti tidak menghasilkan apa-apa sampai atau kecuali diminta secara eksplisit.p
Pengubah mencetak hasil.Anda dapat melakukan pencarian global dengan
g
pengubah seperti:sehingga Anda mendapatkan string dipisahkan oleh
' '
(bisa\n
,\t
atau apa yang harus Anda) yang dapat Anda memproses dengan mudah.Keduanya valid asalkan nilai Anda didahului oleh rentang karakter persamaan hingga akhir baris dan tidak diikuti oleh komentar atau karakter lain dengan semantik yang menyimpang dari "nilai" sederhana.
Edit:
Saya belum bisa berkomentar di sini tentang posting orang lain. Untuk menunjukkan baris, cukup lewati nomor baris, dalam kasus Anda 3, sebelum
s
atau sebelum tanda kutip yang dimulai (seperti dalam vim).Silakan lihat
info sed
. Misalnya, 3.2 dan 4.7 menarik bagi Anda.sumber
Atau jika Anda memiliki konten dalam file:
sumber
Anda dapat menggunakan perintah potong, mengatur delimeter ke '=' dan kemudian mencetak bidang kedua seperti ini:
sumber
Berbagai cara untuk melakukannya, mengingat file Anda disebut
foobar
:Tentukan pola yang akan dicari:
Ekstrak menggunakan
sed
Atau menggunakan
sed
dancut
sumber
Keindahan Linux / Unix adalah bahwa biasanya ada lebih dari satu cara untuk mencapai sesuatu. Dalam kasus op, setidaknya ada empat cara berbeda untuk mengekstrak nama server POP dari file:
grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
sumber