Cách sử dụng 'sed' với đường ống


34

Tôi muốn thay thế một chuỗi xuất ra grep, tôi có:

$ npm info webpack | grep version 

nó cho tôi

$ version: '2.1.0-beta.12',

nhưng tôi muốn có:

$ 2.1.0-beta.12

Vì vậy, tôi nghĩ rằng tôi có thể đạt được rằng sử dụng sedvà thay thế các chất nền không cần thiết. Nhưng đây là phần khó đối với tôi:

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

Làm thế nào có thể đạt được mục tiêu của tôi?

Câu trả lời:


30

Nếu bạn sẽ sử dụng sed, không cần phải sử dụng grep. Thử:

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

Thí dụ:

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

Thay thế: sử dụng awk

Tương tự, nếu chúng ta sử dụng awk, không cần phải grep:

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

Thí dụ:

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

Làm thế nào nó hoạt động:

  • -F"[ ',]+"

    Điều này cho awk sử dụng khoảng trắng, dấu ngoặc đơn hoặc dấu phẩy hoặc bất kỳ kết hợp nào làm dấu tách trường.

  • /version:/{print $2}

    Nếu một dòng chứa version:, sau đó in trường thứ hai.


2
Các -Etùy chọn rõ ràng có nghĩa là sử dụng cú pháp ERE, nhưng GNU tôi sed 4.2.2 tay chỉ đề cập đến -r. -Elàm việc, mặc dù!
Luật29

2
@ Luật29 Có. Tuy nhiên, đối với tất cả các sed GNU hiện đại hợp lý -Elà một từ đồng nghĩa không có giấy tờ cho -r. Tin đồn là POSIX đã giải quyết -E, BSD / OSX đã sử dụng và nếu được thêm vào tiêu chuẩn cuối cùng, tất cả chúng ta sẽ chuyển sang -E.
John1024

6

Lệnh sedthay thế ( s) mong đợi một mẫu tìm kiếm và một chuỗi thay thế. Bạn chỉ cung cấp cho nó một mẫu tìm kiếm. Bạn cũng nên trích dẫn chuỗi đúng trong shell:

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

Điều này sẽ cung cấp cho bạn kết quả '2.1.0-beta.12',, đó không phải là những gì bạn muốn.

Vì đầu ra từ greprất đơn giản, bạn có thể sử dụng cutvới dấu phân cách 'để lấy trường thứ hai của dòng (không cần biểu thức chính quy phức tạp):

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

Điều này sẽ cung cấp cho bạn 2.1.0-beta.12.

Tôi cũng đã thêm -Fvào grepvì chuỗi bạn tìm kiếm là một chuỗi cố định , không phải là biểu thức thông thường.


1

Trước tiên, bạn có thể thử sử dụng sed:

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

hoặc bạn có thể sử dụng awk:

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

mà có lẽ dễ dàng hơn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.