Какие выражения будут соответствовать шаблону (^[0 -9]..[a -zA -Z ]+$ )в команде grep? Баш Linux

Вы пытались создать два системных раздела EFI, также называемых ESP, НЕ два раздела /boot.

У вас может быть только один из них.

Было бы безопасно указать вашему установщику на существующий ESP и добавить запись в grub для загрузки обеих ОС из grub в вашей установке Leap 15, используя что-то вроде того, что сделал этот парень:

https://www.garron.me/en/linux/os-prober-update-grub-arch-linux-debian-ubuntu.html

-1
03.11.2021, 09:33
1 ответ

Давайте разберемся. Прежде всего, обратите внимание, что это RegExp использует синтаксис «Расширенное регулярное выражение» (ERE)-+— это метасимвол, который не работает в синтаксисе «Основного регулярного выражения», который grepиспользует по умолчанию (, что означает, что он будет соответствовать самому себе и потребует литерал +в этой позиции ), поэтому, если вы хотите использовать это регулярное выражение с grep, вам нужно будет передать -Eвариант.

  • ^— это якорь, который связывает эту позицию регулярного выражения с началом строки.
  • [0-9]представляет собой список символов и будет соответствовать любому одиночному(1)символу, попадающему в диапазон сортировки между 0и 9. Что именно это включает, зависит от «порядка сопоставления», определяемого, среди прочего, переменной окружения LC_COLLATE.
  • .соответствует любому одиночному символу, поэтому два ..означают «любые два символа».
  • [a-zA-Z]снова является списком символов и будет соответствовать символам(1 ), которые попадают между aи zи, кроме того, попадают между Aи Z. Опять же, что это означает, зависит от порядка сортировки!
  • +означает «один или несколько предыдущих»
  • $— это якорь, который связывает эту позицию регулярного выражения с концом строки.

Таким образом, ваше регулярное выражение предназначено для(1)соответствия любым строкам, которые

  • начинать с любой цифры
  • , за которыми следуют любые два символа
  • и содержат только буквы (, но не менее одной )до конца строки.

(1)о том, что он может делать на самом деле, см. ниже

Некоторые примечания

  1. В вашем примере вы используете регулярное выражение без кавычек. Это означает, что любые символы открыты для интерпретации оболочкой до того, как они будут переданы команде grep. Если ваш шаблон содержит $или подстановочные символы (*,Списки символов ?и [...]! ), оболочка может попытаться выполнить раскрытие переменной (, заменив таким образом части вашего регулярного выражения )или расширить шаблоны подстановки, возможно, до нескольких имен файлов, чтобы в итоге у вас было больше аргументов в строке команды -что вы изначально задумали. Другие специальные символы оболочки (>, #, ;и т.п. )могут привести к еще более неожиданному поведению. Вы должны использовать

    grep -E '^[0-9]..[a-zA-Z]+$' filename.txt
    

    вместо этого. Обратите внимание, что вы можете избавиться от открывающих и закрывающих якорей, используя флаг -xдля обеспечения соответствия «целой строки -» :

    .
    grep -x -E '[0-9]..[a-zA-Z]+' filename.txt
    
  2. Списки символов, содержащие диапазоны (, такие как a-z), опасны, потому что они могут дать вам не то, что вы думаете. Наивно можно было бы ожидать, что они будут соответствовать всем символам, расположенным между начальным и конечным символом в таблице ASCII, но это верно только для локали C. В других локалях (и, в частности, в обычно установленных системных локалях, таких как en_US.UTF-8), порядок сопоставления примерно такой, как aAbB... zZ, поэтому a-zтакже будет соответствовать большинству букв верхнего -регистра. Кроме того, совпадение на самом деле не на уровне отдельных символов, а на уровне «элементов сопоставления», что означает, что в некоторых локалях дажекомбинации нескольких буквмогут соответствовать (, например. dzsна венгерском языке )! См. этот ответ(или, вообще, большинство ответов @Stéphane Chazelas о сопоставлении с образцом )для получения дополнительной информации. Если вы хотите убедиться, что ваши диапазоны работают, установите порядок сортировки по крайней мере для данной команды через

    LC_COLLATE="C" grep -E '... ' filename.txt
    
7
03.11.2021, 09:43

Теги

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