in mọi thứ sau một dấu gạch chéo


8

Tôi tìm thấy cách in mọi thứ trước một dấu gạch chéo, tuy nhiên tôi cần in mọi thứ sau một dấu gạch chéo. Tôi có một chuỗi như thế blablabal/importantvà tôi chỉ cần in important. Làm cách nào để sửa đổi dòng bên dưới để được in mọi thứ sau dấu gạch chéo chứ không phải trước đó?

sed 's:/[^/]*$::'

Bạn cần in mọi thứ sau dấu gạch chéo đầu tiên, hay mọi thứ sau dấu gạch chéo cuối cùng?
Kira

@Kira Hình như là dấu gạch chéo cuối cùng với tôi $trong regex.
Sly

Tôi chỉ có một cột trong một tệp thử nghiệm. Mỗi hàng là một chuỗi trong đó dấu gạch chéo chỉ xuất hiện một lần.
Iris Pader

5
Sử dụng công cụ phù hợp cho công việc này:cut -d/ -f2- <infile
don_crissti

@don_crissti Có lý do nào cuttốt hơn sedcho việc này không?
Michael Hoffmann

Câu trả lời:


13

Vì bạn đã đề cập trong bình luận của mình rằng tệp chỉ có một dấu gạch chéo, tại sao không sử dụng awk?

Thí dụ:

 ❱ echo "blablabal/important" | awk -F'/' '{print $1}'
blablabal
 ❱ echo "blablabal/important" | awk -F'/' '{print $2}'
important

Điều này chỉ in phần thứ hai trong một chuỗi với nhiều dấu gạch chéo. Thật không may, đó là những gì người hỏi muốn có được
Arthur2e5

Thật. Không có lý do để sedthay thế nó bằng một sự thay thế nếu chỉ có hai kết quả.
Sly

15

Chỉ cần xóa mọi thứ cho đến dấu gạch chéo cuối cùng:

$ echo "blablabal/important" | sed 's:.*/::'
important

Nó cũng hoạt động với nhiều dấu gạch chéo:

$ echo "blablabal/not/ver/interesting/important" | sed 's:.*/::'
important

9

Có vẻ như các câu trả lời khác đang giả định rằng bạn có nhiều dòng dữ liệu trong một tệp, tất cả đều được xử lý. Trong trường hợp này sedhoặc awk(hoặc có thể cut) sẽ là công cụ tốt nhất để xử lý tất cả các dòng trong một lần.

Tuy nhiên, nếu bạn chỉ có một dòng trong biến shell (giả sử bạn đang sử dụng bash), bạn có thể sử dụng mở rộng shell để đạt được kết quả mong muốn mà không phải sinh ra các tiện ích trong các quy trình bên ngoài:

$ var="interesting/bla/blablabal/important"
$ 
$ # everything after the first slash:
$ echo "${var#*/}"
bla/blablabal/important
$ # everything after the last slash:
$ echo "${var##*/}"
important
$ # everything before the first slash:
$ echo "${var%%/*}"
interesting
$ # everything before the last slash:
$ echo "${var%/*}"
interesting/bla/blablabal
$ 

1

Công việc này:

echo "blablabal/important" | sed 's:[^/]*/\(.*\):\1:'

Phần đầu tiên [^/]*, khớp với mọi thứ NHƯNG một dấu gạch chéo, sau đó chúng ta có một dấu gạch chéo theo nghĩa đen /và "khớp tất cả mọi thứ" .*bên trong dấu ngoặc đơn thoát \(.*\). Dấu ngoặc đơn đã thoát ở đó để "lưu" kết quả khớp, nghĩa là nó sẽ chứa mọi thứ sau dấu gạch chéo đầu tiên trong trường hợp này. Việc \1đề cập đến nhóm phù hợp đầu tiên, trong trường hợp này chúng tôi chỉ có một nhóm, vì chỉ có một \(...\)cặp.

Trong sed, ký tự bạn nhập sau ssẽ là dấu phân cách. Đó là một thực tế phổ biến để sử dụng /như dấu phân cách, nhưng trường hợp này sẽ dễ sử dụng cái khác hơn, mặc dù cũng có thể sử dụng dấu gạch chéo.


Vâng, có khoảng 100 cách khác để làm điều đó. Tôi nghĩ câu trả lời của terdon có thể là ngắn nhất sed. cutcũng sẽ là một câu trả lời tốt cho trường hợp cụ thể này.
Kira

các bạn làm những điều hoàn toàn trái ngược mặc dù - bạn có được thứ nhất, anh ấy có được tất cả.
mikeerv

Đúng, đó là lý do tại sao tôi đã hỏi OP rằng anh ta muốn mọi thứ sau cú chém đầu tiên hay cuối cùng, nhưng vì chỉ có một dấu gạch chéo trên mỗi dòng trong trường hợp của anh ta, nên sẽ không có sự khác biệt nào.
Kira

1
sed -et -e's|/|&\n|;//D' <in >out

... sẽ in tất cả mọi thứ sau dấu gạch chéo đầu tiên trên bất kỳ dòng nào có chứa một hoặc nếu không in bất kỳ dòng nào khác chưa được sửa đổi. Nếu bạn thả //nó sẽ chỉ in các dòng nó sửa đổi.

Bạn có thể cần phải sử dụng một \newline theo nghĩa đen thay ncho \nlối thoát, tùy thuộc vào sedphiên bản của bạn .

Ngoài ra, nếu bạn chỉ định số lần xuất hiện ...

sed -et -e's|/|&\n|num;/\n/D'

... bạn có thể xóa các thiết lập của num thứ chém trên một đường thẳng mà không ảnh hưởng bất kỳ dòng mà không có ít nhất num dấu gạch chéo.

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.