Sed loại bỏ tất cả các trận đấu mẫu bắt đầu từ dòng


11

Tôi có dòng sau:

abababtestab

Tôi đang cố gắng tìm ra một sedbiểu thức để loại bỏ tất cả các lần xuất hiện abtừ đầu dòng để dòng biến đổi phải là:

testab

Tôi cảm thấy việc này thật đơn giản, nhưng tôi thực sự không biết gì cả sed.

Những gì tôi có cho đến nay là:

sed 's/^ab//'

Nhưng điều này chỉ loại bỏ sự xuất hiện đầu tiên của ab.

Câu trả lời:


16
sed 's/^\(ab\)*//' <in >out

Bạn nên nhóm nó.

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

Một số s sed có thể không xử lý rất tốt, mặc dù. Mặc dù sao chép biểu thức phụ là một tính năng được chỉ định POSIX của BRE, một số sedkhông hỗ trợ đúng cách. Trong một số trong số đó, mặc dù ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... Có thể làm việc thay thế.


Chính xác những gì tôi đang tìm kiếm cảm ơn! (Tôi sẽ đánh dấu là câu trả lời một khi nó cho phép tôi)
Dan

Ngay cả phiên bản thứ 7 sedtừ khoảng năm 1979 cũng hỗ trợ nó. Nó sẽ phải là một sự bắt chước kém hơn để không xử lý việc nhóm.
Jonathan Leffler

@JonathanLeffler - xem Cơ sở lý luận biểu thức chính quy POSIX , một phần, đó là những gì tôi dựa trên tuyên bố. Có thể đó là một giả định, nhưng có một đoạn ở đó ... Các nhà phát triển tiêu chuẩn đã xem xét hành vi lịch sử phổ biến, hỗ trợ \n*, nhưng không \n\{min,max\}. \(...\)*hoặc \(...\)\{min,max\}, như là kết quả không cố ý của một triển khai cụ thể và họ đã hỗ trợ cả hai biểu thức trùng lặp và khoảng sau các biểu hiện phụ và tham chiếu ngược.
mikeerv

@JonathanLeffler: Nó cũng không hoạt động với phiên bản sed từ các công cụ gia truyền.
cuonglm 8/07/2015

@cuonglm - \(ab\)\1*phiên bản hoạt động với gia truyền mặc định sed\(ab\)*phiên bản hoạt động với gia truyền SuSv4 sed. Ít nhất, nó làm cho bản dựng của tôi. Phải thừa nhận rằng, tôi đã xây dựng bộ gia truyền của mình chống lại musl lib C, và vì vậy tôi có thể tưởng tượng điều đó có thể khiến nó hành xử khác đi. Nhưng thông thường khi một tính năng được chỉ định hoạt động trong một công cụ gia truyền SuSv4 nhưng không phải trong công cụ mặc định, đó là do nhà phát triển đã làm nó.
mikeerv

6

Khác sed:

sed -e ':1' -e 's/^ab//;t1'

Với mỗi dòng đầu vào, chúng tôi thiết lập một nhãn :1, sau đó thực hiện substlation abở đầu dòng. Nếu substlation thành công, tnhánh lệnh est để gắn nhãn 1, làm lại công việc cho đến khi không có abmẫu nào xuất hiện ở đầu dòng, chúng ta đã hoàn thành.


Suy nghĩ của tôi chính xác. Nghiêm túc, bạn không cần phải kiểm tra: s/^ab//; t1là đủ
glenn jackman

@glennjackman: À, tất nhiên rồi. Cập nhật nó!
cuonglm
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.