sách gpt4 ai đã đi

Biểu thức chính quy thay thế nhiều tệp

In lại Tác giả: Space Dog Thời gian cập nhật: 2023-10-29 11:05:02 30 4
mua khóa gpt4 Nike

Tôi cần thay thế tất cả các trường hợp của một biểu thức chính quy bằng một biểu thức chính quy khác trong nhiều tệp ở nhiều thư mục dưới một thư mục gốc.

Ví dụ: Cấu trúc tập tin:

.
|---nguồn
| |---Mô-đun
| | |---một số lớp.cpp
| |---main.cpp
|
|---bao gồm
|---Mô-đun
|---một số lớp.hpp

Về cơ bản thì nó như thế này, nhưng có nhiều tập tin và thư mục hơn.

Tôi cần tìm kiếm một biểu thức chính quy \(std::vector<.*>và thay thế tất cả các trường hợp của nó bằng \(std::vector<.*> const&Phần khó khăn dường như là phải đảm bảo < Nội dung giữa >Không thay đổi.

Ví dụ nó sẽ khớp (std::vectorvà thay thế nó bằng (std::vector const& Một ví dụ phức tạp hơn là:
cuộc thi đấu:(std::vector<>>
Thay thế bằng:(std::vector<>> const&

1 Câu trả lời

Nếu ký tự ">" cuối cùng trong ví dụ của bạn là ký tự ">" cuối cùng trên mỗi dòng, thì lệnh này sẽ hoạt động:

tìm root -name '*.cpp' -print0 |
xargs -0 sed -i 's/\((std::vector<.*>\)\([^>]*$\)/\1 const\&\2/'

Hãy thử sed trên một tệp duy nhất và không có -i trước, ví dụ:

$ tập tin mèo
(std::vector
(std::vector foo
(std::vector<>>
(std::vector<>> thanh

$ sed 's/\((std::vector<.*>\)\([^>]*$\)/\1 const\&\2/' tập tin
(std::vector const&
(std::vector const& foo
(std::vector<>> const&
(std::vector<>> const& bar

Nếu có thể thêm ">" sau ký tự cuối cùng trong ví dụ của bạn thì giải pháp không hề đơn giản, vui lòng đăng một số ví dụ đầu vào tiêu biểu và kết quả đầu ra dự kiến.

Ồ, kệ đi, đây là một kịch bản không hề tầm thường:

$ tập tin mèo
(std::vector
(std::vector foo
(std::vector có thêm > trong văn bản
(std::vector<>>
(std::vector<>> thanh
(std::vector<>> và đây là > một lần nữa

$ awk -v FS= -v str="(std::vector<" '
BẮT ĐẦU{ chiều dài=chuỗi(chuỗi) }
bắt đầu=chỉ số($0,chuỗi) {
cnt = 1
đối với (i = (bắt đầu + lgth); (i < = NF) && (cnt! = 0); i++) {
nếu ($i == "<") cnt++
nếu ($i == ">") cnt--
}
$0 = chuỗi con($0,1,i-1) "const&" chuỗi con($0,i)
}1' tập tin
(std::vector const&
(std::vector const& foo
(std::vector const& với extra > trong văn bản
(std::vector<>> const&
(std::vector<>> const& bar
(std::vector<>> const& và đây là > một lần nữa

Thực hiện trong vòng lặp while:

tìm gốc -tên '*.cpp' -in |
trong khi IFS= đọc -r tập tin; làm
awk -v FS= -v str="(std::vector<" '
BẮT ĐẦU{ chiều dài=chuỗi(chuỗi) }
bắt đầu=chỉ số($0,chuỗi) {
cnt = 1
đối với (i = (bắt đầu + lgth); (i < = NF) && (cnt! = 0); i++) {
nếu ($i == "<") cnt++
nếu ($i == ">") cnt--
}
$0 = chuỗi con($0,1,i-1) "const&" chuỗi con($0,i)
}1' "$file" > tmp &&
mv tmp "$file"
xong

Cách này sẽ không hiệu quả nếu tên tệp của bạn có ký tự xuống dòng, nhưng nếu có ký tự xuống dòng, bạn chỉ cần sửa chúng.

Liên quan đến việc thay thế biểu thức chính quy của nhiều tệp, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/15198494/

30 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com