Xóa ký tự cuối cùng trong một từ nhưng chỉ khi ký tự ở đó - trong bash


12

Làm thế nào để loại bỏ ký tự cuối cùng chỉ khi nó ở đó?

đầu vào:

OpenOffice.org/m
openOffice.org/ozm
Người.
Pfg.
phil.
Giáo sư
tôn trọng.
Roonstr./m
roonstr./ozm

sản phẩm chất lượng:

OpenOffice.org
openOffice.org
Người
Pfg
phil
Giáo sư
kính trọng
Roonstr
roonstr

Tôi đã nhận được nó cho đến nay chỉ còn lại dấu chấm nhưng tiếc là lệnh sed cuối cùng cũng loại bỏ chữ cái g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

Câu trả lời:


12

Bạn chỉ cần thoát khỏi dấu chấm trong sedlệnh của bạn và mọi thứ sẽ ổn. Như thế này:

sed 's/\.$//'

Bởi vì trong trường hợp bạn không thoát khỏi nó, .$sẽ khớp với bất kỳ ký tự nào ở cuối chuỗi.

Ngoài ra bạn có thể đặt tất cả các bạn sed+ grep+ cutvào chỉ là một sed:

sed 's=/[^/]*$==;s/\.$//' filename

Tuyệt, cảm ơn, làm việc! :) Tôi sử dụng một từ điển với hơn 300k dòng vì vậy đây là lý do tại sao tôi sử dụng grep "\." để chỉ nhận được các từ có dấu chấm ở đó.
removeelastdotonlyifitsthere

cũng sed có thể làm điều đó với ai lấy cái gì như thế này: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. Dù sao grep+ sedsẽ làm việc lâu hơn nhiều so với chỉ một sed.
vội vàng

Nếu nó có thể được thực hiện với một chiếc sed thì nó sẽ rất tuyệt. Làm thế nào để áp dụng lệnh sed cuối cùng của bạn?
removeelastdotonlyifitsthere

sed 's/[./]\+[^./]*$//'
Peter.O

Cảm ơn bây giờ tôi không cần cắt, nhưng grep vẫn còn đó. Một sed tương đương với lệnh grep đường ống của tôi sau đó sẽ loại bỏ grep sang, nếu có thể, nó sẽ rất tuyệt. "Ngoài ra, bạn có thể đặt tất cả sed + grep + của bạn vào chỉ một sed" không phù hợp với tôi, in tất cả các từ?
removeelastdotonlyifitsthere

1

Chỉ xóa một ký tự nếu có chính xác mô tả mở rộng tham số.

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

Dấu chấm không đặc biệt trong trường hợp này (một dấu chấm là đặc biệt trong biểu thức chính quy).

Các mẫu khác có thể được loại bỏ bằng %/*:

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

Để xóa cả hai:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

Tất nhiên, để làm việc với một tệp nguồn, sử dụng sed trên tệp sẽ nhanh hơn.
Chỉ nhớ trích dẫn dấu chấm (để khớp với nghĩa đen, nếu không nó có nghĩa là: bất kỳ ký tự nào).

 $ sed 's,/.*,,;s,\.$,,' file

Đây phải là câu trả lời được chấp nhận. Cần nhiều upvote hơn.
David park

0

Chỉ cần thay đổi một chút biểu thức thông thường của bạn: để thoát khỏi . Và bạn không cầngrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
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.