Sử dụng sed
:
sed 's/^[^"]*"\([^"]*\)".*/\1/'
Điều đó tìm kiếm: đầu dòng, một loạt các trích dẫn, một trích dẫn kép, ghi lại một loạt các trích dẫn, một trích dẫn kép và bất cứ điều gì khác trên dòng, và thay thế nó bằng các tài liệu bị bắt.
$ sed 's/^[^"]*"\([^"]*\)".*/\1/' <<'EOF'
> xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
> "/home/path/to/file1": Permission denied (13) rsync:
> "/home/path/to/file2": Permission denied (13) rsync:
> "/home/path/to/file3": Permission denied (13)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$
Thử nghiệm trên RHEL 5 Linux với GNU sed
, nhưng chỉ sử dụng các tính năng có thể hoạt động trong phiên bản UNIX ™ phiên bản thứ 7 của sed
.
Ngẫu nhiên, một cách đơn giản hơn để làm điều đó là với hai lệnh thay thế; thay đổi mọi thứ lên đến và bao gồm cả trích dẫn kép đầu tiên thành một chuỗi trống (đó là một chuỗi gồm 0 hoặc nhiều hơn các trích dẫn không theo sau là một trích dẫn kép); thay đổi mọi thứ sau những gì bây giờ là trích dẫn kép đầu tiên thành không có gì:
sed 's/^[^"]*"//; s/".*//'
Ngẫu nhiên, lệnh bạn đã thử (`sed -n '/" /, / "/ p') in từ một dòng chứa một trích dẫn kép sang dòng tiếp theo chứa một trích dẫn kép, mà không chỉnh sửa các dòng nào cả. Đó là lý do tại sao nó dường như không làm việc cho bạn - nó đã làm những gì bạn yêu cầu, nhưng những gì bạn yêu cầu nó làm không phải là những gì bạn định yêu cầu nó làm.
Hiệu quả-khôn ngoan, không có khả năng là một sự khác biệt có thể đo lường được trong hiệu suất. Về mặt dễ bảo trì, tôi nghi ngờ cái sau ít đánh thuế vào các tế bào não.