Làm thế nào để tôi có được trạng thái thoát khi sử dụng lệnh sed?


11

Các greplệnh đưa ra một trạng thái thoát:

$echo "foo.bar" | grep -o foo
foo
$echo $?
0
$echo "foo.bar" | grep -o pop
$echo $?
1  

Nhưng tôi cần sử dụng sedvà tôi nhận ra rằng nó không có trạng thái thoát:

$echo "foo.bar" | sed 's/bar.*$//'
foo.
$echo $?
0
$echo "foo.bar" | sed 's/pop.*$//'
foo.bar
$echo $?
0  

Tôi biết rằng tôi nên chơi xung quanh với -qtùy chọn, nhưng tôi đã không thành công.


7
Lưu ý rằng sedhầu hết chắc chắn có trạng thái thoát, nó chỉ không làm những gì bạn cần ở đây. Nếu sedlệnh thất bại, ví dụ, nếu bạn cố gắng chạy nó trên một tập tin bạn không có quyền ghi vào hoặc một trong đó không tồn tại, sedsẽ thoát ra với một trạng thái thoát phi-0. Trạng thái thoát chỉ cho biết liệu có sedđược quản lý để thực hiện những gì bạn đã nói hay không và echo "foo.bar" | sed 's/pop.*$//'được thực hiện chính xác. Nó xóa tất cả các dòng với pop. Rằng không có dòng nào là không liên quan, lệnh vẫn hoạt động.
terdon

@Zanna Tôi sẽ đăng một câu trả lời, nhưng tôi cảm thấy điều này không thực sự trả lời câu hỏi. Nó chỉ giải thích một quan niệm sai lầm, nhưng không cung cấp một giải pháp hữu ích như thép thép dưới đây. Vì vậy, một nhận xét có vẻ thích hợp hơn.
terdon

Câu trả lời:


13

Bạn có thể sử dụng q n để thoát với trạng thái thoát n - nhưng để làm cho nó hữu ích, bạn cũng sẽ cần sử dụng một số Điều khiển luồng và phân nhánh :

t
nhánh có điều kiện (nghĩa là: nhảy đến nhãn) chỉ khi một s/// lệnh đã thành công kể từ khi dòng đầu vào cuối cùng được đọc hoặc một nhánh có điều kiện khác được thực hiện.

Có lẽ tốt nhất là chọn một giá trị cho n khác với một trong các giá trị trạng thái thoát tiêu chuẩn:

Trạng thái thoát bằng 0 biểu thị thành công và giá trị khác 0 biểu thị thất bại. GNU 'sed' trả về các giá trị lỗi trạng thái thoát sau:

0
 Successful completion.

1
 Invalid command, invalid syntax, invalid regular expression or a
 GNU 'sed' extension command used with '--posix'.

2
 One or more of the input file specified on the command line could
 not be opened (e.g.  if a file is not found, or read permission is
 denied).  Processing continued with other files.

4
 An I/O error, or a serious processing error during runtime, GNU
 'sed' aborted immediately.

Ví dụ

$ echo "foo.bar" | sed 's/bar.*$//; t; q42' ; echo $? 
foo.
0

trong khi

$ echo "foo.bar" | sed 's/baz.*$//; t; q42' ; echo $? 
foo.bar
42

Nếu bạn muốn bỏ qua việc in mặc định không gian mẫu, sau đó thay thế qbằng Q(lưu ý đó Qlà phần mở rộng GNU).


1

Dưới đây là cách tìm kiếm regex với sed và tô sáng các kết quả khớp hoặc trả về mã thoát (5) nếu không tìm thấy kết quả khớp:

Đây là input.txt:

hello there
my dear old friend
a lot of things
we'll pass along the end

Đây là chức năng của tôi để In tất cả + Đánh dấu các trận đấu + Trả về mã thoát:

highlight()
{
  pattern=$1
  shift
  sed '/'"${pattern}"'/,${s//\x1b[32m&\x1b[0m/g;b};$q5' "$@"
}

$ tô sáng "lo \ | end" input.txt || echo -e "\ n * Không tìm thấy kết quả phù hợp *"

hel lo there
my old old fri end
a lo t of thing will will
pass a lo ng the end

Khi không có kết quả khớp, nó sẽ trả về mã thoát (5). Bạn có thể sử dụng nó với mèo và ống | cũng:

$ cat input.txt | tô sáng "nóng \ | và" || echo -e "\ n * Không tìm thấy kết quả phù hợp *"

xin chào,
người bạn cũ thân yêu của tôi,
rất nhiều điều
chúng ta sẽ vượt qua

* Không tìm thấy kết quả phù hợp *

Cảm ơn https://unix.stackexchange.com/a/405725/43233 - Tôi đang sử dụng tùy chọn này + sed thoát.

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.