В UNIX / Linux есть команда для проверки того, находитесь ли вы на терминале.
if tty -s
then
echo Terminal
else
echo Not on a terminal
fi
Или, если вы хотите придерживаться функций расширения переменных bash, используйте две косые черты -, чтобы заменить каждое совпадение заменой:
second_arg="${second_arg//[^[:alnum:]]/_}"
^------ here
Сsed
:
$ echo 'This is a test; specifically it is test number 25!' | sed 's/[^a-zA-Z0-9]/_/g'
This_is_a_test__specifically_it_is_test_number_25_
В дополнение к ответу Джеффа Шаллера, существуют различные вещи, которые может выполнять подстановка параметра «поиск и замена»:
Дано:s="_one_two_one_two"
заменить первое "два"
$ echo ${s/two/X}
_one_X_one_two
заменить все "два"
$ echo ${s//two/X}
_one_X_one_X
заменить "два", если оно закреплено в конце строки
$ echo ${s/%two/X}
_one_two_one_X
заменить "единицу", если она закреплена в начале строки(нет, замены нет)
$ echo ${s/#one/X}
_one_two_one_two
В bash (при использовании )a ${arg/one/two}
заменит только первое вхождение on
. Заменить все двойное первое /
на это ${arg/one/two}
, так что для вашего случая:
arg=${arg//[^[:alnum:]]/_}
Вторая косая черта может быть изменена на #
для обозначения начала и на %
для обозначения конца.
Если строка:
➤ a=one_two_/one_two_one
Для изменения первого экземпляра (только )изone
:
➤ echo ${a/one/xXx}
xXx_two_/one_two_one
Первый экземплярtwo
:
➤ echo ${a/two/xXx}
one_xXx_/one_two_one
Строка one
в начале параметра:
➤ echo ${a/#one/xXx}
xXx_two_/one_two_one
Строка one
в конце параметра:
➤ echo ${a/%one/xXx}
one_two_/one_two_xXx
Строка/one
(начинается с косой черты):
➤ echo ${a/\/one/xXx}
one_two_xXx_two_one
Все повторенияone
:
➤ echo ${a//one/xXx}
xXx_two_xXx_two_xXx