วิธีใช้ 'sed' กับ piping


34

ฉันต้องการแทนที่สตริงที่ส่งออกจากgrepฉันมี:

$ npm info webpack | grep version 

มันเอาท์พุทฉัน

$ version: '2.1.0-beta.12',

แต่ฉันต้องการ:

$ 2.1.0-beta.12

ดังนั้นฉันคิดว่าฉันอาจประสบความสำเร็จในการใช้sedและแทนที่วัสดุพิมพ์ที่ไม่จำเป็น แต่นี่เป็นส่วนที่ยากสำหรับฉัน:

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

จะบรรลุเป้าหมายได้อย่างไร

คำตอบ:


30

หากคุณกำลังจะใช้ sed ไม่จำเป็นต้องใช้ grep เช่นกัน ลอง:

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

ตัวอย่าง:

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

ทางเลือก: การใช้ awk

ในทำนองเดียวกันถ้าเราใช้ awk ไม่จำเป็นต้อง grep ด้วย:

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

ตัวอย่าง:

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

มันทำงานอย่างไร:

  • -F"[ ',]+"

    สิ่งนี้บอกให้ awk ใช้ช่องว่างเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายจุลภาคหรือชุดค่าผสมใด ๆ เป็นตัวคั่นฟิลด์

  • /version:/{print $2}

    หากมีบรรทัดอยู่version:ให้พิมพ์ฟิลด์ที่สอง


2
-Eตัวเลือกที่เห็นได้ชัดว่าหมายถึงการใช้ไวยากรณ์ ERE แต่ฉัน GNU sed 4.2.2 -rด้วยตนเองเท่านั้นกล่าว -Eทำงานได้ แต่!
Law29

2
@ Law29 ใช่ สำหรับทุก GNU ทันสมัยพอสมควร sed แต่-Eเป็นที่ไม่มีเอกสาร-rไวพจน์ ข่าวลือก็คือ POSIX ได้ตัดสิน-Eแล้วซึ่ง BSD / OSX ได้ใช้ไปแล้วและหากนั่นถูกเพิ่มเข้าไปในมาตรฐานขั้นสุดท้ายเราทุกคนจะเปลี่ยนไป-Eใช้
John1024

6

sedคำสั่งแทน ( s) คาดว่าจะมีรูปแบบการค้นหาและสตริงทดแทน คุณให้มาพร้อมกับรูปแบบการค้นหาเท่านั้น คุณควรอ้างสตริงอย่างถูกต้องในเชลล์:

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

นี่จะทำให้คุณได้ผลลัพธ์'2.1.0-beta.12',ซึ่งไม่ใช่สิ่งที่คุณต้องการ

เนื่องจากเอาต์พุตจากgrepนั้นง่ายมากคุณอาจใช้cutกับตัวคั่น'เพื่อรับฟิลด์ที่สองของบรรทัด (โดยไม่จำเป็นต้องใช้นิพจน์ทั่วไปที่ซับซ้อน):

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

2.1.0-beta.12ซึ่งจะทำให้คุณ

ฉันได้เพิ่ม-Fไปด้วยgrepเนื่องจากสตริงที่คุณค้นหาเป็นสตริงคงที่ไม่ใช่นิพจน์ทั่วไป


1

ก่อนอื่นคุณอาจลองใช้sed:

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

หรือคุณอาจใช้awk:

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

ซึ่งน่าจะง่ายกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.