Мне нужно иметь возможность сделать, это заменить пробел ( ) с точкой (
.
) в строке в Bash.
Я думаю, это было бы довольно просто, но я новичок, поэтому не могу понять, как изменить подобный пример для этого использования.
Мне нужно иметь возможность сделать, это заменить пробел ( ) с точкой (
.
) в строке в Bash.
Я думаю, это было бы довольно просто, но я новичок, поэтому не могу понять, как изменить подобный пример для этого использования.
Ответы:
Используйте встроенную замену строки оболочки. Пример:
foo=" "
# replace first blank only
bar=${foo/ /.}
# replace all blanks
bar=${foo// /.}
См. Http://tldp.org/LDP/abs/html/string-manipulation.html для получения дополнительной информации.
tr
! ... В зависимости от доступной памяти и ресурсов hw ... Но вы правы !: В зависимости от вида работы, выделенные инструменты остаются более эффективными!
$'\n'
Вы можете использовать tr
, как это:
tr " " .
Пример:
# echo "hello world" | tr " " .
hello.world
От man tr
:
ОПИСАНИЕ
Преобразование, сжатие и / или удаление символов из стандартного ввода, запись в стандартный вывод.
В bash вы можете выполнить замену шаблона в строке с помощью ${VARIABLE//PATTERN/REPLACEMENT}
конструкции. Используйте только /
и не //
заменять только первое вхождение. Шаблон является шаблоном подстановки, как глобусы файлов.
string='foo bar qux'
one="${string/ /.}" # sets one to 'foo.bar qux'
all="${string// /.}" # sets all to 'foo.bar.qux'
Попробуй это
echo "hello world" | sed 's/ /./g'
Используйте подстановку параметров:
string=${string// /.}
Попробуйте это для путей:
echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'
Он заменяет пространство внутри строки в двойных кавычках на +
пение, затем заменяет +
знак обратной косой чертой, а затем удаляет / заменяет двойные кавычки.
Я должен был использовать это, чтобы заменить пробелы в одном из моих путей в Cygwin.
echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'
sed
. Цитаты не имеют значения.
tr
длинные строки. В моей системеtr
выигрывает у bash, начиная со строк, содержащих больше1000
символов. Похоже, сложность времени bash хуже, чем линейная. Небольшой тест:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. С длиной строки 1M (= 2 ^ 20)tr
взял0.04s
и bash 5.0.11 взял17s
. С 2Mtr
взял0.07s
(ожидалось), но bash взял69s
(в 4 раза больше длины в два раза).