У меня есть переменная var
в скрипте Bash, содержащая строку, например:
echo $var
"some string.rtf"
Я хочу удалить последние 4 символа этой строки и назначить результат новой переменной var2
, чтобы
echo $var2
"some string"
Как я могу это сделать?
Ответы:
Во-первых, вы должны четко указать, что вы хотите. Если вы знаете, что строка заканчивается,
.rtf
и вы хотите удалить.rtf
, вы можете использоватьvar2=${var%.rtf}
. Если вы не знаете, что такое суффикс, но хотите удалить все, начиная с последнего.
, тогда вы можете использоватьvar2=${var%.*}
. Если вы хотите только сохранить все до первого.
, вы можете использоватьvar2=${var%%.*}
. Эти два последних варианта имеют одинаковый результат, если есть только один период, но если их может быть больше одного, вы должны решить, какой вы хотите.Если вы действительно хотите всегда удалять точное количество символов, вот несколько вариантов.
Вы указали bash специально, поэтому мы начнем со встроенных команд bash. Дольше всего работал тот же синтаксис удаления суффиксов, который я использовал выше: чтобы удалить четыре символа, используйте
var2=${var%????}
. Вам нужно один вопросительный знак на каждый удаленный символ, так что это становится громоздким для больших длин подстрок.Немного новее извлечения подстроки:
var2=${var::${#var}-4}
. Здесь вы можете поставить любое число вместо,4
чтобы удалить другое количество символов. (Символ${#var}
заменяется длиной строки, поэтому на самом деле запрашивается оставить первые (длина - 4) символа.)Более новые версии bash (в частности, 4+, что означает, что та, которая поставляется с MacOS, не будет работать) позволяют упростить это до просто
var2=${var::-4}
.Если вы на самом деле не используете bash, а какую-то другую оболочку типа POSIX, удаление суффикса все равно будет работать, даже в простой старой черте (где ни один из остальных не будет). В Zsh, все они работают , но вы должны поставить
0
между двоеточием: иvar2=${var:0:-4}
т.д. В КШ, вам нужно 0 , а также использовать явное выражение длиной 4:var2=${var:0:${#var}-4}
.Конечно, вы можете использовать подстановку команд, чтобы сделать это с помощью служебной программы; Есть много, которые будут работать, но что-то вроде
var2=$(cut -c -4 <<<"$var")
, вероятно, самый короткий вариант.источник
Вы можете сделать так:
источник
bash
4+, но в более ранней версии вы можете использовать немного дольше${v::${#v}-4}
.${v::-4}
хрипит "зш: закрывающая скобка ожидается". Но ответ @fredtantini ниже${v:0:-4}
работает отлично.Для удаления четырех символов из конца строки используйте
${var%????}
.Чтобы удалить все после окончательного
.
использования${var%.*}
.источник
${var#????}
.Что сработало для меня:
Но я использовал его для обрезки строк в файле, поэтому он выглядит неловко. Реальное использование было:
cut
только уводит вас от обрезки с некоторой начальной позиции, что плохо, если вам нужны строки переменной длины. Таким образом, это решение переворачивает (rev
) строку, и теперь мы относимся к ее конечной позиции, затем используем,cut
как уже упоминалось, и возвращаем (сноваrev
) ее обратно в исходный порядок.источник
rev
переворачивает строки, а не строки.echo $SOME_VAR | rev | ...
вероятно, не будет вести себя так, как можно было бы ожидать.Использование расширения переменной / замена подстроки :
Так что вы можете сделать:
С другой стороны,
Если у вас всегда одинаковые 4 буквы
Если это всегда заканчивается на
.xyz
:Вы также можете использовать длину строки:
или просто
echo ${var::-4}
источник
len=${#var}; echo ${var::len-4}
может быть сокращено доecho ${var:0:-4}
:-) РЕДАКТИРОВАТЬ: или, как указал @iyonizer, простоecho ${var::-4}
...Вы могли бы использовать sed,
Пример:
источник
var2
?Я попробовал следующее, и это сработало для меня:
Вывод:
hel
источник
Надеюсь, что приведенный ниже пример поможет,
echo ${name:0:$((${#name}-10))}
->${name:start:len}
start
является отправной точкой строкиlen
это длина строки, которая должна быть удалена.Пример:
Вывод:
Примечание: в Bash 4.2 добавлена поддержка отрицательной подстроки
источник
Это сработало для меня, рассчитав размер строки.
Вам просто нужно отобразить значение, которое нужно вернуть, и затем сохранить его, как показано ниже
источник
В этом случае вы можете использовать базовое имя, если у вас есть тот же суффикс к файлам, которые вы хотите удалить.
Пример:
Если вы не знаете суффикс и хотите удалить все после и включая последнюю точку:
% означает рубить. это то, что вы режете, * подстановочный знак
источник