Использование оператора if для списка слов

Используйте для этого sed:

$ sed -E 's/ (([0-9]{1,3}\.){3})[0-9]{1,3} / \1x /' file
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

Это ищет пробел, за которым следуют три набора из[0-9]{1,3}\.(числа от одной до трех цифр, за которыми следует точка ), которая захватывается в \1. Затем мы также заменяем последний набор [0-9]{1,3}и последний пробел. Все это заменяется на ␣\1x␣, где \1— первая группа из трех чисел и точек.

8
30.04.2020, 15:41
3 ответа

Версия ifне будет столь надежной, как case, потому что она поймает все подстроки yesmaybebanana-, которые будут соответствовать b, bebanaи т. д.:

#!/usr/bin/env bash

program_output='bebana'

if [[ "yesmaybebanana" =~ ${program_output} ]]; then echo "good word: ${program_output}"; else echo "bad word: ${program_output}"; fi

Выход:

good word: bebana

И это не переносимо -попробуйте запустить его с тире:

$ dash./a.sh
./a.sh: 6:./a.sh: [[: not found
bad word: bebana

Вы можете значительно упростить свою caseверсию, используя несколько слов в одну строку:

case $program_output in
  yes | maybe | banana) echo "good word: $program_output" ;;
  *) echo "bad word: $program_output" ;;
esac
18
28.04.2021, 23:17

Если вы хотите использовать bashфункции регулярных выражений (, которые, однако, являютсяbash-специфичными и, следовательно, не переносимыми ), вы должны по крайней мере использовать правильный оператор типа "ИЛИ" -для обеспечить точное совпадение с одним из разрешенных слов, как в

if [[ $program_output =~ ^(yes|maybe|banana)$ ]]
then
    echo "Good word: $program_output"
else
    echo "Bad word: $program_output"
fi

Обратите внимание, что регулярное выражение не должно заключаться в кавычки, а альтернативы слов заключены между якорями ^и $, чтобы гарантировать, что никакая подстрока -не может инициировать совпадение (, например yessir, которые в противном случае были бы захвачены паттерном yes).

19
28.04.2021, 23:17

здесь также работают расширенные шаблоны bash :

if [[ $program_output == @(yes|maybe|banana) ]]
then
    echo "program output is one of yes, maybe, banana"
fi
13
28.04.2021, 23:17

Теги

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