Tôi đang phân tích cú pháp một tệp PHP và các phần tử mẫu thử hàm trong HTML. Tuy nhiên, nếu có ký hiệu và nó sẽ phá vỡ mã của tôi.Sed and Awk Escaping Ampersands (&)
Input: function foo (&$var1, &$var2){...}
// như String
đầu ra mong muốn (trong HTML): &$var1, &$var2
// về cơ bản, chỉ ra các biến để họ được hiển thị đúng trong trình duyệt
Ngay bây giờ , Tôi đang gửi từng biến vào phương thức phụ của awk và sau đó đến sed.
sub(/^&/, "\\\&", param) #param is the variable of interest (e.g. &$var1)
#Intermediate step in case it's relevant. The awk-processed elements
#are sent to ${file}_param.txt. Each set of parameters are delimited by colons.
param=$(cut -d: -f$counter ${file}_param.txt)
#Replace some default text in template file with real stuff.
sed -i "s|@PARAM|$param|1" "$base"_funct_def.txt
Output tôi nhận được: Các ampersands đang được giải thích. Toàn bộ trận đấu được thay thế.
Cách ly vấn đề: Làm như sau thay vào đó hiển thị 'g $ var1' trong trình duyệt như tôi muốn. Tuy nhiên, tôi đang cố gắng nhận '&' thay thế.
sub(/^&/, "g", param)
nỗ lực của tôi: tôi sử dụng ba dấu xồ nguợc vì tôi nghĩ awk đầu tiên sẽ xử lý nó thành '\ &' đó, đưa vào sed, sẽ giải thích '\ &' như đen '&'. Tôi đã thử bất cứ nơi nào từ 1 đến 6 dấu gạch chéo ngược mặc dù, vô ích.
CÂU HỎI: Tôi làm cách nào để thoát khỏi &?
Manual: http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_92.html
Một số/câu hỏi thiết kế "siêu" về những gì tôi đang cố gắng để làm gì (không cần thiết cho câu hỏi !!)
Tôi có bó Các tệp PHP mà tôi đang cố gắng tạo ra một chút tài liệu cho (có cấu trúc giống như Javadocs). Tôi sẽ xem xét và phân tích cú pháp nó bằng cách sử dụng các kịch bản lệnh REGEX và shell, để tôi liệt kê ra tên hàm, các tham số và các mục trả về. Cho đến nay, REGEX đã làm việc khá tốt, tôi nghĩ, nhưng tôi đã đọc rất nhiều về làm thế nào đây là một cái gì đó mà REGEX KHÔNG nên được sử dụng cho. Tôi muốn chào đón bất kỳ ý kiến về bất kỳ điều này (làm thế nào là tài liệu thường được tạo ra?). Cảm ơn các bạn!
gì '$ param' thực sự chứa? Nếu các lệnh không chạy tuần tự (ví dụ: nếu thực sự có một số mã khác ở giữa), bạn không nên đặt chúng trong cùng một khối mã, nó gây hiểu lầm. – doubleDown
Xin lỗi về phần gây hiểu nhầm. Tôi sẽ ghi nhớ điều đó trong tương lai. $ param chứa phần tử tham số. Ví dụ, nếu có một hàm: 'hàm foo (& $ arg1, $ arg2)' $ param được cho là '' & $ arg1'' Tin tốt mặc dù: Tôi tìm thấy một sửa chữa. Trước khi thực hiện sed, tôi đã chắc chắn để thoát khỏi bất kỳ '&'. Tôi thêm vào sau đây ngay sau khi chuyển nhượng param đầu tiên: 'param = $ (echo $ param | sed 's |^& | \\ & | g')' Điều này trái ngược với việc cố gắng để bọc những thứ trong awk một phần của mã. – bobbyjoe93