2015-04-08 13 views
5

Proste pytanie GNU m4, ale nie mogę znaleźć poprawnej odpowiedzi. Chciałbym, aby wydrukować nagłówek Przecena początkowy/końcowy fragment kodu:GNU m4: uciekający backticks (`)

``` 
echo Hello 
``` 

Jak utworzyć makro GNU M4 zawierający 3 odwrócone, pojedyncze apostrofy? coś

define(`md_code',````') 
md_code 
echo Hello 
md_code 

Odpowiedz

5

dostał odpowiedź od Erica Blake na liście mailingowej M4: http://lists.gnu.org/archive/html/m4-discuss/2015-04/msg00004.html

changequote jest twoim przyjacielem. Będzie to zrobić:

define(`md_code', changequote([, 
])[changequote([,])```changequote(`,')]changequote(`,')) 

muszę zmienić cytaty dwukrotnie: raz wokół definicji makra, ponieważ sama definicja zamierza wykorzystać (odwrócone, pojedyncze apostrofy) w sposób nieobiektywny; i ponownie w rozszerzeniu makra, ponieważ rozwinięcie wyprowadzi z powrotem asymetrię w backtickach w postaci ; dla każdej zmienionej oferty, oryginalne cytaty muszą zostać przywrócone. Zakłada się, że domyślne cytowanie pozostaje na (backticks) " w całym przebiegu m4.

Chociaż w twoim przypadku, polecam używanie zmiany cytatu z góry na coś jeszcze, i globalnie zapisuj twoje dane wejściowe pod tymi cytującymi regułami zamiast domyślnych (tylnych) reguł cytowania. Pamiętaj, że autoconf został specjalnie celowany z [] jako znakami cudzysłowu, , ponieważ były one prawdopodobnie zbalansowane pod względem wyjściowym, w przeciwieństwie do (odciski) i "nie występują w zbalansowanych parach w skryptach powłoki. W rzeczywistości, wybieranie 2- lub 3-bajtowych ciągów cytowania jest jeszcze mniej niejednoznaczne, chociaż wymaga wtedy więcej pisania.