2013-01-15 46 views
13

Làm thế nào để loại bỏ tất cả các ký tự n từ một chuỗi đặc biệt sử dụng kịch bản shell,cắt nhân vật n cuối cùng trong một chuỗi sử dụng shell script

ssl01:49188,,, 
ssl01:49188, 
ssl01:49188,,,,, 
ssl01:49188,ssl999999:49188,,,,, 
ssl01:49188,abcf999:49188,,,,, 

Sản lượng sẽ theo định dạng sau

ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188,ssl999999:49188 
ssl01:49188,abcf999:49188 

Trả lời

38

Để trả lời câu tiêu đề của bạn đặt câu hỏi với quy định cụ thể cắt nhân vật n cuối cùng trong một chuỗi, bạn có thể sử dụng tính năng khai thác chuỗi con trong Bash.

[email protected]$ A="123456" 
[email protected]$ echo ${A:0:-2} # remove last 2 chars 
1234 

Tuy nhiên, dựa trên ví dụ của bạn, bạn dường như muốn loại bỏ tất cả dấu phẩy trailing, trong trường hợp này bạn có thể sử dụng sed 's/,*$//'.

[email protected]$ echo "ssl01:49188,ssl999999:49188,,,,," | sed 's/,*$//' 
ssl01:49188,ssl999999:49188 

hoặc, đối với một giải pháp hoàn toàn Bash, bạn có thể sử dụng loại bỏ chuỗi con:

[email protected]$ X="ssl01:49188,ssl999999:49188,,,,," 
[email protected]$ shopt -s extglob 
[email protected]$ echo ${X%%+(,)} 
ssl01:49188,ssl999999:49188 

Tôi sẽ sử dụng cách tiếp cận sed nếu việc chuyển đổi cần phải được áp dụng cho toàn bộ một tập tin, và các chuỗi bash cách tiếp cận xóa nếu chuỗi đích đã có trong biến bash.

+6

Xin lưu ý rằng giải pháp đầu tiên chỉ hoạt động đối với các phiên bản mới hơn của Bash (> = 4.2-alpha). – chiborg

+11

cho các phiên bản cũ hơn: sử dụng #item để nhận được độ dài của chuỗi, vì vậy nếu bạn đang cố gắng loại bỏ các ký tự cuối cùng, hãy thực hiện nó như item = "abcdefgh" echo $ {item: 0: $ {# item} -n}; – rivu

+0

Tôi biết điều này là tầm thường, nhưng tôi nghĩ rằng tôi sẽ nói nó ở đây vì nó đã vấp phải tôi. Hãy chắc chắn rằng bạn đặt bán kết tràng vào cuối giống như rivu có nó! Tôi quên mất dấu chấm phẩy và có đủ loại lỗi! – user972276

11

Với sed:

sed 's/,\+$//' file 
+1

Đó hoạt động tốt, nhưng chỉ với _GNU_ 'sed'. Một sự cải tiến tuân thủ POSIX là 'sed 's /, \ {1, \} //''. Một phiên bản hoạt động với cả GNU và BSD/OSX 'sed': 'sed -E' s /, + // '' – mklement0

1

Tôi đoán bạn cần xóa những thứ không cần thiết , 'S

sed 's/,,//g;s/\,$//g' your_file 

thử nghiệm:

> cat temp 
ssl01:49188,,, 
ssl01:49188, 
ssl01:49188,,,,, 
ssl01:49188,,, 
ssl01:49188, 
ssl01:49188,,,,, 
ssl01:49188,ssl999999:49188,,,,, 
ssl01:49188,abcf999:49188,,,,, 
> sed 's/,,//g;s/\,$//g' temp 
ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188 
ssl01:49188,ssl999999:49188 
ssl01:49188,abcf999:49188 
> 
1

Sử dụng sed:

sed 's/,,*$//g' file 
Các vấn đề liên quan