2013-08-01 20 views
35

Tôi đã sau tập tin thử nghiệmsed - Bình luận một dòng phù hợp với một chuỗi cụ thể VÀ mà chưa được nhận xét ra

AAA 
BBB 
CCC 

Sử dụng sed sau tôi có thể nhận xét ra các BBB dòng.

# sed -e '/BBB/s/^/#/g' -i file 

Tôi muốn chỉ nhận xét ra dòng nếu nó chưa có # khi bắt đầu.

# sed -e '/^#/! /BBB/s/^/#/g' file 

sed: -e expression #1, char 7: unknown command: `/' 

Bất kỳ ý tưởng nào về cách tôi có thể đạt được điều này?

Trả lời

54

Giả sử bạn không có bất kỳ dòng với nhiều # s này sẽ làm việc:

sed -e '/BBB/ s/^#*/#/' -i file 

Lưu ý: bạn không cần/g kể từ khi bạn đang làm nhiều nhất là một thay thế trên mỗi dòng.

+0

Điều đó có hiệu quả, cảm ơn! –

+2

Điều này sẽ luôn luôn chỉnh sửa dòng phù hợp để bắt đầu với một #. Vì vậy, nếu nó bắt đầu với ba '#' s sau lệnh này nó sẽ "làm sạch" nó để chỉ bắt đầu với một '#'. Để giảm bớt vấn đề này nếu nó là một vấn đề, chỉ cần thay đổi phần phù hợp cho phù hợp (ví dụ: 'sed -e '/^BBB /' ...) –

+1

'sed'/^ # BBB/'' bạn muốn nói. Nhưng nếu BBB ở đâu đó ở giữa nó sẽ không hoạt động. Có một tùy chọn để viết 'sed'/^ # /! {/ BBB/s/^/# /} ''sẽ hoạt động tốt hơn nhưng giải pháp ban đầu của tôi là đơn giản hơn, miễn là bạn biết giới hạn của nó. – aragaer

2

Tôi tìm giải pháp này để hoạt động tốt nhất.

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file 

Không cần biết có bao nhiêu ký hiệu "#", nó sẽ không bao giờ thêm một biểu tượng khác. Nếu mẫu bạn đang tìm kiếm không bao gồm dấu "#", nó sẽ thêm nó vào đầu dòng và nó cũng sẽ thêm dấu cách.

Nếu bạn không muốn có một không gian dấu

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\1/' file 
0

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

này không làm việc cho tôi với các từ khóa *.sudo, không có ý kiến ​​gì cả ...

Ony sự cú pháp bên dưới hoạt động: sed -e '/sudo/ s/^#*/#/' file

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