Используйте для этого 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
— первая группа из трех чисел и точек.
Версия 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
Если вы хотите использовать bash
функции регулярных выражений (, которые, однако, являютсяbash
-специфичными и, следовательно, не переносимыми ), вы должны по крайней мере использовать правильный оператор типа "ИЛИ" -для обеспечить точное совпадение с одним из разрешенных слов, как в
if [[ $program_output =~ ^(yes|maybe|banana)$ ]]
then
echo "Good word: $program_output"
else
echo "Bad word: $program_output"
fi
Обратите внимание, что регулярное выражение не должно заключаться в кавычки, а альтернативы слов заключены между якорями ^
и $
, чтобы гарантировать, что никакая подстрока -не может инициировать совпадение (, например yessir
, которые в противном случае были бы захвачены паттерном yes
).