'Sed' boru ile nasıl kullanılır


34

Ben çıkarılan bir dize değiştirmek istiyor grep, ben vardır:

$ npm info webpack | grep version 

beni çıktılar

$ version: '2.1.0-beta.12',

ama sahip olmak istiyorum:

$ 2.1.0-beta.12

Bu yüzden sedgereksiz alt dizgileri kullanarak bunu başarabileceğimi düşünüyorum . Ama işte benim için zor kısım:

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

Hedefime nasıl ulaşabilirim?

Yanıtlar:


30

Sed kullanacaksanız, grep kullanmanıza gerek yoktur. Deneyin:

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

Örnek:

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

Alternatif: awk kullanımı

Benzer şekilde, eğer awk kullanırsak, grep yapmaya da gerek yoktur:

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

Örnek:

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

Nasıl çalışır:

  • -F"[ ',]+"

    Bu, awk'ye boşluklar, tek tırnaklar veya virgüller veya bunların herhangi bir bileşimini alan ayırıcı olarak kullanmasını söyler.

  • /version:/{print $2}

    Bir çizgi varsa version:, ikinci alanı yazdırın.


2
Bu -Eseçenek açıkça ERE sözdizimini kullanmak anlamına geliyor, ancak GNU sed 4.2.2 kılavuzum yalnızca bahsetti -r. -Eyine de çalışıyor!
Yasa 29,

2
@ Law29 Evet. Tüm makul modern GNU sed için ise, -Ebir olan belgesiz için eşanlamlı -r. Söylediklerine göre POSIX'in -EBSD / OSX'in zaten kullandığı bir çözüm olduğu ve eğer son standarda eklenirse, hepimiz geçeceğiz -E.
John1024

6

sedYedek komutu ( s) Bir arama desen ve bir yedek dizi bekler. Sadece bir arama düzeni ile sağladınız. Ayrıca, dizelerde kabuğun içinde doğru bir şekilde alıntı yapmanız gerekir:

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

Bu size sonuç verecek '2.1.0-beta.12',, bu tam olarak istediğiniz şey değil.

Çıktısı grepçok basit olduğundan, satırın ikinci alanını elde etmek cutiçin sınırlayıcı ile birlikte kullanabilirsiniz '(karmaşık düzenli ifadelere gerek kalmadan):

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

Bu sana verecek 2.1.0-beta.12.

Ben de eklendi -Fiçin greparamak dize olduğundan sabit dize değil, normal bir ifade.


1

İlk önce, kullanmayı deneyebilirsiniz sed:

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

ya da kullanabilirsiniz awk:

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

bu muhtemelen daha kolay.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.