Предполагая, что ваша строка «A» сохранена в файле с именем input.xml:
sed -e 's/<item></<item>LOVER.png;LOVER-ever.png</' input.xml
Это вставляет строку «LOVER.png; LOVER-ever.png» в первый «пустой»
Обратите внимание, что синтаксический анализ и обработка XML или HTML или аналогичных файлов структурированных данных с помощью регулярных выражений в лучшем случае ненадежны (и даже тогда только в самых простых случаях). Для получения надежных результатов следует использовать синтаксический анализатор XML или аналогичный. и валидный XML тоже.
Откуда вы взяли это определение, к какому выражению вы относитесь?
Если мы говорим о выражениях оболочки, оба символа могут использоваться по отдельности, но определение для ?
не совпадает, так как тогда оно всегда соответствует одному символу, а не единице или нулю.
Если мы говорим о регулярных выражениях, оба являются операторами, которые помещаются после выражения. Так в "?*"должно быть помещено после чего-то другого.
Разница в том, что вbash
(вопрос, отмеченный тегом,)*
соответствует любой строке длиной от нуля или более символов, а ?*
соответствует строке, состоящей как минимум из 1 символа. Рассмотрим, например, два файла:file.txt
и xfile.txt
и попробуйте перечислить их с помощью ls ?*file.txt
или ls *file.txt
.
Один из реальных сценариев, когда я использую такую конструкцию, состоит в том, чтобы вывести список скрытых файлов. Очень часто я так и делаю
ls.??*
Двойные вопросительные знаки здесь предотвращают перечисление текущего каталога .
и родительского каталога ..
, как это было бы с более простой формой ls.*
.
Здесь я должен указать, что мой .??*
не совершенен; например, имена файлов, состоящие всего из двух символов, например .f
, не соответствуют этому шаблону. Более надежным решением является ls {..?,.[!.]}*
, но обычно это слишком много для меня.