Разница между * и? * Chall в Bash

Предполагая, что ваша строка «A» сохранена в файле с именем input.xml:

sed -e 's/<item></<item>LOVER.png;LOVER-ever.png</' input.xml

Это вставляет строку «LOVER.png; LOVER-ever.png» в первый «пустой» в строке, преобразовывая вашу строку A в строку B.

Обратите внимание, что синтаксический анализ и обработка XML или HTML или аналогичных файлов структурированных данных с помощью регулярных выражений в лучшем случае ненадежны (и даже тогда только в самых простых случаях). Для получения надежных результатов следует использовать синтаксический анализатор XML или аналогичный. и валидный XML тоже.

8
09.03.2019, 20:45
2 ответа

Откуда вы взяли это определение, к какому выражению вы относитесь?

Если мы говорим о выражениях оболочки, оба символа могут использоваться по отдельности, но определение для ?не совпадает, так как тогда оно всегда соответствует одному символу, а не единице или нулю.

Если мы говорим о регулярных выражениях, оба являются операторами, которые помещаются после выражения. Так в "?*"должно быть помещено после чего-то другого.

7
27.01.2020, 20:08

Разница в том, что вbash(вопрос, отмеченный тегом,)*соответствует любой строке длиной от нуля или более символов, а ?*соответствует строке, состоящей как минимум из 1 символа. Рассмотрим, например, два файла:file.txtи xfile.txtи попробуйте перечислить их с помощью ls ?*file.txtили ls *file.txt.

Один из реальных сценариев, когда я использую такую ​​конструкцию, состоит в том, чтобы вывести список скрытых файлов. Очень часто я так и делаю

ls.??*

Двойные вопросительные знаки здесь предотвращают перечисление текущего каталога .и родительского каталога .., как это было бы с более простой формой ls.*.


Здесь я должен указать, что мой .??*не совершенен; например, имена файлов, состоящие всего из двух символов, например .f, не соответствуют этому шаблону. Более надежным решением является ls {..?,.[!.]}*, но обычно это слишком много для меня.

18
27.01.2020, 20:08

Теги

Похожие вопросы