Câu hỏi thêm một từ vào cuối dòng trong tệp txt


Tôi có một tệp cần có "ĐƯỢC" ở cuối một dòng nhất định

dòng cần được sửa đổi là dòng đầu tiên không kết thúc bằng "ĐƯỢC" 

Tôi có thể grep tập tin để có được dòng được sửa đổi bằng cách sử dụng đoạn mã sau

grep -vnm 1 OK '/content2'

tôi cần sự giúp đỡ trong việc thêm mẫu OK vào cuối dòng này

Thí dụ:

nếu nội dung tệp có các dòng sau

aaaaaaaaaaaaaa OK
bbbbbbbbbbbbbb OK  
cccccccccccccc  
dddddddddddddd
eeeeeeeeeeeeee OK

tôi cần phải thêm OK vào dòng chứa cccccccccccc chỉ có


3
2017-09-03 19:17


gốc


mẫu đầu vào & đầu ra cần thiết. - αғsнιη
@KasiyA đã thêm ví dụ vào câu hỏi - Fat Mind
Bạn nói rằng 'dòng cần được sửa đổi là dòng tiếp theo đến dòng cuối cùng kết thúc bằng "OK". Trong trường hợp này, cái cuối cùng kết thúc bằng OK là dòng cuối cùng - eeeeeeeeeeeeee OK. Vậy tại sao bạn sẽ thêm vào cccccccccccccc? - muru
@ KasiyA Không cần phải quá mài mòn. Câu hỏi có thể đã được xây dựng phần nào rõ ràng hơn (đáng chú ý là để loại bỏ sự mơ hồ về những gì cần làm trong trường hợp cạnh của việc có Không dòng kết thúc bằng OK), nhưng nó loại trừ cách giải thích của bạn về việc thêm OK vào dòng không OK đầu tiên cũng như mọi dòng tiếp theo, vì nó tuyên bố rõ ràng "một dòng nhất định [...] chỉ". - zwets


Các câu trả lời:


Bạn có thể sử dụng như sau awk chương trình:

awk -v s=" OK" '/OK$/ { print; } !/OK$/ { print $0 s; s=""; }'

Nó hoạt động như thế này:

/OK$/ { print; }

in ra bất kỳ dòng nào kết thúc bằng OK như là, trong khi

!/OK$/ { print $0 s; s=""; }

in ra bất kỳ dòng nào không phải kết thúc bằng OK với giá trị của biến s nối thêm.

Biến s ban đầu là chuỗi ' OK'. Nó thay đổi thành chuỗi rỗng sau lần gặp đầu tiên của một dòng không kết thúc bằng OK.

Cập nhật

Thậm chí chính xác hơn:

awk -v s=" OK" '!/OK$/ { print $0 s; s=""; } /OK$/'

loại bỏ { print; } hành động cho /OK$/ điều kiện, như { print; } là hành động mặc định.

Điều chỉnh

Nhìn vào câu hỏi một lần nữa, nó không nói OK nên được thêm vào dòng đầu tiên không có OK, nhưng thay vào dòng đầu tiên không có OK theo sau một dòng làm có một OK. Vì vậy, chúng ta phải giữ một biến, c cờ đó ít nhất một OK dòng đã được nhìn thấy và một biến d những lá cờ mà chúng tôi đã thực hiện:

awk ' /OK$/ { if (!d) c=1; } 
     !/OK$/ { if (c) d=1; } 
     c && d { s=" OK"; c=0; }
     { print $0 s; s=""; }'

4
2017-09-03 20:55



Downvoter xin vui lòng bình luận về những gì vấn đề là với câu trả lời này? - zwets
tuyệt quá! và nếu có nhiều phần hơn, /OK$/ { print; s="OK";} làm công việc, phải không? - Lety
Tôi nghĩ rằng downvote có thể là vì trên văn bản mẫu, nó không hoạt động chính xác vì bản chỉnh sửa đã thêm nhiều khoảng trống vào cuối hai dòng (có thể vô ý). Nếu bạn loại bỏ những khoảng trống đó, nó hoạt động độc đáo, mặc dù nó thêm một khoảng trống vào cuối dòng ddddd, không chắc đó có phải là vấn đề hay không. - Jason Conti
Ah, đó là hậu quả của dấu phẩy trong lệnh in. Nó chèn một không gian. Điều này có thể được khắc phục bằng cách sử dụng print $0s; thay vì print $0,s;và cài đặt s=" OK" ngay từ đầu. Sẽ sửa chữa. - zwets
@Letizia Vâng, đó là khá. Làm cho tôi nhận ra một sự mơ hồ mặc dù: câu hỏi xác định rằng OK nên được thêm vào dòng đầu tiên không có OK  sau một dòng đang có ĐƯỢC. Giải pháp như nó sẽ thêm OK đến dòng đầu tiên không có OK, bất kể một OK đã xảy ra trước đó. Thêm sửa chữa. - zwets


sed -ri 's/.*cccccccccccccc */cccccccccccccc OK/g' filename

Ở đâu filename là tên của tên tệp đầu vào của bạn.


-1
2017-09-03 19:39



ccccc chỉ là ví dụ, nó có thể là bất kỳ điều gì, điều kiện cho dòng cần được thay đổi (đó là dòng đầu tiên mà dos không chứa OK ở cuối của nó) - Fat Mind
Chỉ dòng đầu tiên hoặc tất cả các dòng không có OK? - Harris
chỉ dòng đầu tiên - Fat Mind