2012-02-08 29 views
15

Tôi muốn xóa bất kỳ ABC nào ở cuối chuỗi.Xóa mẫu ở cuối chuỗi bằng cách sử dụng các công cụ bash hoặc các công cụ bash khác

Điều tốt nhất tôi đã nảy ra là

echo ${String}| sed -e 's/["ABC"]*$//g' 

Tuy nhiên, nó sẽ loại bỏ tất cả các A, hoặc B hoặc C vào cuối chuỗi.

Nếu String là DAAAAABCBBBCCABCABC, nếu tôi sử dụng các biểu thức trên, nó sẽ trở lại "D", thay vì "DAAAAABCBBBCC"

Có cách nào tốt hơn để làm điều này? Cảm ơn.

Trả lời

10

này nên làm việc:

echo "DAAAAABCBBBCCABCABC" | sed -e 's/\(ABC\)*$//g' 

Kết quả:

DAAAAABCBBBCC 

chuỗi Surround giữa dấu ngoặc đơn và * áp dụng cho tất cả các chữ bên trong chúng theo thứ tự chính xác.

4

Bạn nên sử dụng:

sed -E 's/(ABC)+$//' 

OR:

sed -r 's/(ABC)+$//' 

Cả hai sẽ cho sản lượng:

DAAAAABCBBBCC 
+0

Đáng nói rằng cả hai thông số cho phép giải thích expresion như một biểu thức chính quy mở rộng. Tôi đã thấy '-E' được Mac sử dụng (Darwin) và' -r' bởi các bản phân phối Linux khác. – LopSae

+0

'-E' là một tùy chọn không có giấy tờ để tương thích với BSD sed. Bạn gần như chắc chắn sẽ sử dụng '-r'. '-E' sẽ thất bại trên phiên bản busybox của sed. – Six

16

bash thể làm điều này trong nội bộ. Sau đây loại bỏ bất kỳ "ABC" chuỗi ở cuối, và kết quả của nó có thể được sử dụng trong giao biến, một lệnh hoặc bất cứ điều gì:

${String%ABC} 

Xem http://tldp.org/LDP/abs/html/string-manipulation.html

+1

Điều này sẽ chỉ xóa lần xuất hiện cuối cùng của 'ABC'. Loại Shell Parameter Expansion này sử dụng glob, vì vậy nó không thể diễn tả "bất kỳ số lượng ABC nào" với nó. Thông tin thêm: http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion – LopSae

+0

Điểm tốt! Cảm ơn – mabraham

+0

@LopSae với các dấu mở rộng mở rộng ('shopt -s extglob'), nó sẽ hoạt động:' $ {String %% + (ABC)} ' –

Các vấn đề liên quan