2015-04-08 14 views
5

Eine einfache GNU m4 Frage, aber ich kann nicht die richtige Antwort finden. Ich möchte einen Abschlags Header Start/Beenden eines Codeabschnitt drucken:GNU m4: entkommen Backticks (`)

``` 
echo Hello 
``` 

Wie erstelle ich eine GNU M4 Makro, um die 3 Backticks enthalten? so etwas wie

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

Antwort

5

bekam eine Antwort von Eric Blake auf der M4-Mailingliste: http://lists.gnu.org/archive/html/m4-discuss/2015-04/msg00004.html

change ist dein Freund. Dies wird es tun:

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

Ich habe Anführungszeichen zweimal ändern: einmal um die Makrodefinition, da die Definition selbst beabsichtigt (Backticks) zu verwenden, in einer unausgewogenen Weise; und wieder in der Makro-Erweiterung, da die Erweiterung Backticks in einer unsymmetrischen Ausgabe ausgeben wird; Für jedes geänderte Angebot müssen die ursprünglichen Anführungszeichen wiederhergestellt sein. Dies setzt voraus, dass die Standard-Quotierung während des gesamten m4-Laufs bei (Backticks) ' bleibt.

in Ihrem Fall Obwohl, ich würde sonst mit change vorne zu etwas empfehlen und global schreiben Sie Ihre Eingabe unter denen Regeln anstelle des Standard zitieren (Backticks) 'zitiert Regeln. Denken Sie daran, dass autoconf absichtlich mit [] als Anführungszeichen, ging, weil sie sehr wahrscheinlich in der Ausgabe ausgeglichen waren, im Gegensatz zu (Backticks) und nicht in ausgeglichenen Paaren in Shell-Skripten auftreten. In der Tat, Auswahl von 2- oder 3-Byte-Zeichenketten ist noch weniger mehrdeutig, obwohl es erfordert dann mehr Typisierung.