Cara menggunakan 'sed' dengan perpipaan

34

Saya ingin mengganti string yang dihasilkan grep, saya punya:

$ npm info webpack | grep version 

itu output saya

$ version: '2.1.0-beta.12',

tetapi saya ingin memiliki:

$ 2.1.0-beta.12

Jadi saya pikir saya mungkin mencapai itu dengan menggunakan seddan mengganti substring yang tidak perlu. Tapi inilah bagian yang sulit bagi saya:

$ npm info webpack | grep version: | sed s/version: /
sed: -e expression #1, char 10: unterminated `s' command

Bagaimana saya bisa mencapai tujuan saya?

Oskar Szura
sumber

Jawaban:

30

Jika Anda akan menggunakan sed, tidak perlu juga menggunakan grep. Mencoba:

npm info webpack | sed -En "s/version: '(.*)',/\1/p"

Contoh:

$ echo  "version: '2.1.0-beta.12'," | sed -En "s/version: '(.*)',/\1/p"
2.1.0-beta.12

Alternatif: menggunakan awk

Demikian pula, jika kita menggunakan awk, tidak perlu juga grep:

npm info webpack | awk -F"[ ',]+" '/version:/{print $2}'

Contoh:

$ echo  "version: '2.1.0-beta.12'," | awk -F"[ ',]+" '/version:/{print $2}'
2.1.0-beta.12

Bagaimana itu bekerja:

  • -F"[ ',]+"

    Ini memberitahu awk untuk menggunakan spasi, tanda kutip tunggal, atau koma atau kombinasi darinya sebagai pemisah bidang.

  • /version:/{print $2}

    Jika satu baris berisi version:, cetak bidang kedua.

John1024
sumber
2
The -Epilihan jelas berarti untuk menggunakan sintaks ERE, tapi GNU saya sed 4.2.2 pengguna hanya menyebutkan -r. -Ebekerja!
Law29
2
@ Law29 Ya. Untuk semua GNU sed modern cukup, bagaimanapun, -Eadalah sinonim tanpa dokumen untuk -r. Rumornya adalah bahwa POSIX telah memutuskan -E, yang sudah digunakan BSD / OSX, dan, jika itu ditambahkan ke standar akhir, kita semua akan beralih ke -E.
John1024
6

The sedperintah pengganti ( s) mengharapkan pola pencarian dan string pengganti. Anda hanya memberinya pola pencarian. Anda juga harus mengutip string dengan benar di shell:

$ npm info webpack | grep 'version:' | sed 's/version: //'

Ini akan memberi Anda hasilnya '2.1.0-beta.12',, yang tidak sesuai dengan yang Anda inginkan.

Karena output dari grepsangat sederhana, Anda dapat menggunakan cutdengan pembatas 'untuk mendapatkan bidang kedua dari baris (tanpa perlu ekspresi reguler yang rumit):

$ npm info webpack | grep -F 'version:' | cut -d "'" -f 2

Ini akan memberimu 2.1.0-beta.12.

Saya juga menambahkan -Funtuk grepsejak string yang Anda cari adalah string tetap , bukan ekspresi reguler.

Kusalananda
sumber
1

Pertama, Anda dapat mencoba menggunakan sed:

npm info webpack | grep version: | sed 's/version: //'

atau Anda dapat menggunakan awk:

npm info webpack | grep version: | awk '{print $2}'

yang mungkin lebih mudah.

MariusMatutiae
sumber