Заменить все не буквенно-цифровые с подчеркиванием

В UNIX / Linux есть команда для проверки того, находитесь ли вы на терминале.

if tty -s
then
echo Terminal
else
echo Not on a terminal
fi
0
05.10.2018, 20:23
4 ответа

Или, если вы хотите придерживаться функций расширения переменных bash, используйте две косые черты -, чтобы заменить каждое совпадение заменой:

second_arg="${second_arg//[^[:alnum:]]/_}"
                         ^------ here
9
28.01.2020, 02:13

С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_
3
28.01.2020, 02:13

В дополнение к ответу Джеффа Шаллера, существуют различные вещи, которые может выполнять подстановка параметра «поиск и замена»:

Дано:s="_one_two_one_two"

  1. заменить первое "два"

    $ echo ${s/two/X}
    _one_X_one_two
    
  2. заменить все "два"

    $ echo ${s//two/X}
    _one_X_one_X
    
  3. заменить "два", если оно закреплено в конце строки

    $ echo ${s/%two/X}
    _one_two_one_X
    
  4. заменить "единицу", если она закреплена в начале строки(нет, замены нет)

    $ echo ${s/#one/X}
    _one_two_one_two
    
2
28.01.2020, 02:13

В 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
1
28.01.2020, 02:13

Теги

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