$
не в переменной, ни в буквальном \r
. Они добавляются к выходу, потому что вы сказали, printf
форматировать следующим образом: %q
. Реальный дополнительный символ «возврат каретки», код 0x0D
, который управляющая последовательностью является \r
.
Корень вашей проблемы в том, что ваши .xml
файлы, похоже, используют окончания строк CR + LF из мира DOS / Windows. Смотрите это сравнение в Википедии.
В документе Extensible Markup Language (XML) 1.0 (пятое издание) говорится:
Чтобы упростить задачи приложений, процессор XML должен вести себя так, как будто он нормализует все разрывы строк во внешних проанализированных объектах (включая объект документа) при вводе перед синтаксическим анализом, переводя как двухсимвольную последовательность, так
#xD #xA
и любую#xD
, за которой не следует#xA
одному#xA
персонажу.
Здесь #xD
обозначает CR, #xA
обозначает LF.
В вашем случае все find … | xargs
заявление процессор XML (давайте такие проблемы, как это в сторону). Если вы хотите полностью соответствовать спецификации, вы должны пропустить каждый .xml
файл dos2unix
с самого начала.
Но поскольку настоящая проблема связана с содержимым переменной, в вашем случае этого может быть достаточно:
var=`find … | dos2unix | xargs`
Если у вас нет dos2unix
, tr -d '\r'
будет работать как замена в этом контексте (спасибо @GordonDavisson за указание на это).