sử dụng vims mẫu-multi-items {n} để khớp với không gian thứ 5 trong một dòng


2

Với mục này từ crontab của chúng tôi

1 3 1 * * find / var / log / tomcat / * -mtime +61 -type f -delete

Tôi muốn khớp với char không gian thứ 5 để tôi có thể tách phần lệnh ra khỏi phần trường thời gian. Cron có thể có các định dạng khác nhau, vì vậy tôi muốn có thể khớp DOW dưới dạng mặt trời hoặc 0.

Biểu thức chính quy tôi đang sử dụng trong vim khớp với không gian đầu tiên là và thay thế bằng giữ chỗ "T".

: g / \ * / s / \ (\ \) \ {1 \} / T /

Tôi còn thiếu gì để phù hợp với không gian thứ n hoặc thứ 5. Cái này không làm gì cả

: g / \ * / s / \ (\ \) \ {5 \} / T /

Tôi muốn tạo ra một sự cố khi các lệnh được chạy trong cron để thử và cân bằng tải trên các máy chủ của chúng tôi.

Phụ lục

Tôi hiểu những gì tôi đã làm sai với tìm kiếm / thay thế ở trên.

(\ \) \ {5 \}

Điều đó được mở rộng thành năm không gian sau nhau và không phải là không gian thứ 5 vì có các ký tự giữa các không gian.

Điều này hoạt động đến không gian thứ năm nhưng liều "\ 1" thay thế không bao gồm toàn bộ nguyên tử phù hợp.

: g / * / s / \ ([0-9A-Za-z * \ /,] * \) \ {5} / \ 1 T /

Nó để lại sau đây thay thế.

*  T find /var/log/tomcat/* -mtime +61 -type f -delete

Tôi đang tìm kiếm

1 3 1 * * T find /var/log/tomcat/* -mtime +61 -type f -delete

Câu trả lời:


2
:g/\*/s/\(\ \)\{5\}/T/

Điều này không hoạt động như bạn muốn, vì nó nói "thay thế năm khoảng trắng liên tiếp bằng T" thành Vim.

Lệnh này sẽ hoạt động khi bạn cần:

:g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+/\1T/

Xem :help /\vnếu bạn không biết chế độ "rất kỳ diệu" là gì.


: g / * / s / ^ \ v (\ s * (\ S + \ s +) {4} \ S +) \ s + (. *) / "\ 1"; "\ 3" / bây giờ tạo ra những gì tôi đang tìm kiếm . "1 3 1 * "; "find / var / log / tomcat / -mtime +61 -type f -delete"
nelaaro

1

Các SedSlệnh đề nghị bởi Andreas và Andy là rất thích hợp cho điều loại này:

:line1,line2SedS/ \+/ T /5

đưa toàn bộ chức năng vào vim để mô phỏng sed là một chút quá sức. Nhưng nó đã có tác dụng.
nelaaro

0

Regex grep này phù hợp theo cách tôi mong đợi và thay thế theo cách tôi muốn.

:g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"\1";"\3"/

1 3 1 * * find /var/log/tomcat/* -mtime +61 -type f -delete

"1 3 1 * *";"find /var/log/tomcat/* -mtime +61 -type f -delete"

Nhờ câu trả lời xaizeks .

Sử dụng: bufdo trong vim Tôi có thể chỉnh sửa tất cả các tệp tôi đã mở để thực hiện các thay thế tôi muốn và cuối cùng là "| w" lưu chúng. Vì vậy, tất cả 10 bản sao tôi có trong các công việc cron máy chủ của chúng tôi hiện đã sẵn sàng để lấy ra.

:bufdo g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"\1";"\3"/|w
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.