Как сопоставить буквы верхнего и нижнего регистра с помощью регулярного выражения в bash?

Ваша ОС содержит множество небольших и простых инструментов для обработки текста. В этом случае я бы использовалcut:

cut -d; -f1 <FILE >tmpfile && mv tmpfile FILE
8
12.11.2020, 10:35
3 ответа

[OK] Соответствует любому символу в скобках, скобки не говорят о том, что он нечувствителен к регистру.

Вы могли бы сделать:

[[ "$status" =~ ^[Oo][Kk]$ ]]

или я бы сделал следующее:

[[ "${status,,}" == ok ]]

Оператор ,,для расширения параметра преобразует всю переменную в нижний регистр для целей сравнения.

17
18.03.2021, 22:50

Вы можете выполнить сопоставление с образцом следующим образом:

[[ $status == @(ok|OK|okay) ]] && echo "is the same"

Или, аналогично идее jesse _b в предыдущем посте, оператор ^^для расширения параметра преобразует всю переменную в верхний -регистр для целей сравнения:

[[ "${status^^}" == OK ]] && echo "is the same"
3
18.03.2021, 22:50

[[ $status =~ OK ]](или[[ $status =~ "OK" ]])соответствует, если$statusсодержит OK, и [[ $status =~ [OK] ]]соответствует, если содержит символ в этом наборе OK, поэтому либо O, либо K.

С регулярными выражениями вам нужно использовать ^или $до привязки шаблона соответственно в начале и в конце темы, если вы хотите сопоставить тему в целом, а не внутри Это.

Чтобы выполнить поиск без учета регистра в bash, вы можете использовать параметр nocasematch:

Это относится к сопоставлению шаблонов оболочки с помощью Korn -стиля [[ $var = pattern ]]или стандарта case $var in (pattern)и к сопоставлению регулярных выражений с [[ $var =~ regexp ]].

Итак, здесь можно сделать:

shopt -s nocasematch
[[ $status = ok ]] && echo yes
[[ $status =~ ^ok$ ]] && echo yes
case $status in
  (ok) echo yes
esac

(вы, вероятно, захотите сбросить nocasematchвпоследствии или сбросить его до предыдущего значения (см. typeset restore="$(shopt -p nocasematch)"для сохранения и eval "$restore"для восстановления ), так как оставление его включенным повлияет на все операции сопоставления шаблонов ).

Или вы можете использовать:

[[ $status = [oO][kK] ]] && echo yes
[[ $status =~ ^[oO][kK]$ ]] && echo yes
case $status in
  ([oO][kK]) echo yes
esac
case $status in
  (ok | OK | Ok | oK) echo yes
esac

Варианты на основе caseявляются стандартным синтаксисом POSIX sh.

В оболочке zshвместо глобального nocasematchпараметра глобального (и искажения всех операторов сопоставления с образцом )можно использовать расширенные операторы подстановки или операторы регулярных выражений PCRE, которые выборочно включают регистр -нечувствительное сопоставление для одного шаблона или части одного шаблона.

Например,

set -o extendedglob
[[ $status = (#i)ok ]]

или:

zmodload zsh/pcre
[[ $status -pcre-match '^(?i)ok$' ]]

Или для эквивалента bash's ${var,,}используйте $var:lа-ля csh или${(L)var}:[ "$status:l" = ok ]

В zsh,вам следует избегать использования переменной с именем $status, так как это переменная, которая содержит статус выхода предыдущей команды в качестве псевдонима стиля Bourne -$?, как в большинстве оболочек Bourne, отличных от -(. ] csh, tcsh, rc, es, fish не менее ).

В варианте ksh93 оболочки Korn (, чей [[...]]и bash, и zsh скопировали ), вы должны сделать [[ $status = ~(i)ok ]].

10
18.03.2021, 22:50

Теги

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