2013-06-21 25 views
5

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!

+0

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

+0

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

Trả lời

0

Tôi tin HTML đọc & làm ký tự dấu và. Trong tập lệnh awk của bạn, bạn có thể sử dụng:

sub(/^&/, "&", param) 

Cần ký hiệu đô la bằng dấu gạch chéo ngược, ví dụ: & $ var cần phải được viết là & \ $ var, hoặc sed và awk sẽ cố gắng mở rộng $ var dưới dạng biến.

+1

Thật không may, tôi không nghĩ đó là vấn đề. Thay thế nó bằng "& amp" sẽ vẫn được diễn giải bởi awk và sed như REGEX '&', sao chép mục phù hợp trong đầu ra. (Tôi đã thử những gì bạn đề nghị chỉ là một kiểm tra sanity. Không làm việc ra.) – bobbyjoe93

+0

Tôi đã thay đổi câu trả lời của tôi sau khi làm một số thử nghiệm. Các dấu hiệu đồng đô la không thoát được dường như đang gây ra vấn đề. – gbrener

0

Sử dụng hai dấu gạch chéo ngược (ví dụ: sub(/^&/, "\\&", param)) hoạt động đối với tôi. Nó có hiệu quả với bạn không?

Nó được ghi chép lại trong the nawk manual bạn đề cập đến trong câu hỏi của bạn:

Như thường lệ, để chèn một dấu chéo ngược trong chuỗi, bạn phải viết hai dấu xồ nguợc. Do đó, hãy viết '\\ & 'trong một chuỗi liên tục để bao gồm một chữ '&' trong việc thay thế

Ngoài ra, chức năng sub() của bạn được về cơ bản thay thế một dấu bằng ký hiệu. Vì vậy, có lẽ đó là lý do tại sao bạn nghĩ rằng nó không hoạt động ngay cả với hai dấu gạch chéo ngược.

+0

Đã làm việc sau khi gửi đầu ra của phụ để sed? Tôi nghĩ rằng phụ là xuất một chữ '&', nhưng khi nó được chuyển đến sed, '&' được diễn giải một lần nữa. Vì vậy, đối với phụ, tôi thực sự đang cố gắng để xuất ra '\ &', để nó được thoát trong phần sed. – bobbyjoe93

0

sed phương pháp:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' 

Output:

&$var1, &$var2 

Hoặc nếu HTML code là cần thiết, vượt qua đó để một util như txt2html:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' | txt2html 
Các vấn đề liên quan