mppopm
Filter Quoting ¶The non-terminal qtext
appears frequently in the mpdpopm
filter grammar (see mppopm
Filter Syntax). These textual tokens
are required to be enclosed in quotation marks, either by single-quote
or a double-quote characters (ASCII characters 39 or 34, respectively;
cf.
ExpectQuoted in the MPD codebase) This brings up the question of how
to represent single- or double-quotes inside the quoted text. MPD
employs the time-honored tradition of “escaping” them with a
backslash character (ASCII character 92). This then implies that
backslashes in the quoted text must themselves be
backslash-escaped.
For example, to test against the text
foo\bar''
using double-quotes, we would enclose the text in "
characters,
and backslash-escape any "
, '
, and \
characters
therein, to obtain
"foo\\bar\""
We could also choose to quote the text using single-quotes in the same manner:
'foo\\bar\"'
Tragically, to use this text in a filter in the shell with
mppopm
, we will need to again quote the text in order to
protect special characters therein from the shell.
Let us suppose we had songs by the pathologically named artist foo\bar”. A properly quoted filter expression would be:
(artist == "foo\\bar\"")
To invoke this on the command line, however, we would need to quote
the filter itself (to make it into a single argument for
mppopm
), which would require quoting the entire filter:
mppopm findadd "(artist =~ \"foo\\\\bar\\\"\")"
In this particular case, quoting the filter using single-quotes might be simpler
mppopm findadd '(artist == "foo\\bar\"")'
If the artist name contained a single-quote, e.g.
foo'bar
We could quote it using "
s
(artist =~ "foo\'bar")
but to express this in the shell we would need to protect the single-quote from bash:
mppopm findadd '(artist =~ "foo\'"'"'bar")'
Quoting the artist name using '
s, and protecting that
from the shell is left as an exercise for the reader.