Удалите последний знак строки с помощью обработки строк в сценарии оболочки

Можно изменить размер разделов с gparted. Старайтесь изменить порядок раздела.

195
10.10.2016, 14:48
12 ответов
[

] В оболочке POSIX синтаксис []${t:-2}[] означает нечто другое - он расширяется до значения []t[], если []t[] установлено и не установлено нуля, и в противном случае до значения []2[]. Для обрезки одного символа с помощью расширения параметра, синтаксис, который вам, вероятно, нужен, составляет []${t%? }[][

] [

]Обратите внимание, что в []ksh93[], []bash[] или []zsh[], []${t:(-2)}[] или []${t: -2}[] (обратите внимание на пробел) []являются[] законными как расширение подстроки, но, вероятно, не являются тем, что вы хотите, так как они возвращают подстроку, начинающуюся с позиции 2 символов в конце (i. e. она удаляет []первый [] символ []i[] строки []ijk[]). [

] [

]Смотрите раздел "Расширение параметров оболочки" справочного руководства Bash для получения дополнительной информации:[

] []
116
27.01.2020, 19:28
[

] С помощью []bash[] 4. 2 и выше, вы можете сделать:[

] [
${var::-1}
] [

]Пример:[

] [
$ a=123
$ echo "${a::-1}"
12
] [

]Заметьте, что для более старых []bash[] ( например, []bash 3.2.5[] на OS X), вы должны оставить пробелы между двоеточиями и после них: [

] [
${var: : -1}
]
198
27.01.2020, 19:28
[

] для удаления последних []n[] символов из строки, которая не использует []sed[] или []awk[]: [

] [
> echo lkj | rev | cut -c (n+1)- | rev
] [

], например, последний символ []один символ [] можно удалить, используя следующее:[

] [
> echo lkj | rev | cut -c 2- | rev

> lk
] [

] из меню []rev[]:[

] [
] [

]DESCRIPTION[
]. Утилита rev копирует указанные файлы в стандартный вывод, изменение порядка символов в каждой строке. Если ни один файл не является специфицированным... fied, считывается стандартный вход.[

] [
] [

]UPDATE:[

] [

]если вы не знаете длину строки, попробуйте:[

] [
$ x="lkj"
$ echo "${x%?}"
lk
]
69
27.01.2020, 19:28
[

] Достаточно просто использовать регулярное выражение:[

] [
n=2
echo "lkj" | sed "s/\(.*\).\{$n\}/\1/"
]
5
27.01.2020, 19:28
[
t=lkj
echo ${t:0:${#t}-1}
] [

] Вы получаете подстроку от 0 до длины строки -1. Обратите внимание, однако, что это вычитание специфично для бэша и не будет работать на других оболочках.[

] [

]Например, []dash[] не может разобрать даже[

] [
echo ${t:0:$(expr ${#t} - 1)}
] [

]Например, на Ubuntu, []/bin/sh[] это []dash[][

]
18
27.01.2020, 19:28

Некоторые уточнения. Чтобы удалить более одного символа, вы можете добавить несколько вопросительных знаков. Например, чтобы удалить последние два символа из переменной: $ SRC_IP_MSG , вы можете использовать:

SRC_IP_MSG=${SRC_IP_MSG%??}
5
27.01.2020, 19:28

Вы также можете использовать head , чтобы распечатать все символы, кроме последнего.

$ s='i am a string'
$ news=$(echo -n $s | head -c -1)
$ echo $news
i am a strin

Но, к сожалению, некоторые версии head не включают опцию ведущего - . Это относится к головке , которая поставляется с OS X.

15
27.01.2020, 19:28

Используя sed, это должно быть так же быстро, как

sed 's/.$//'

Ваш единственный echo тогда echo ljk | sed 's/.$//'
Используя это, 1-строчная строка может быть любого размера.

66
27.01.2020, 19:28

В зависимости от некоторых параметров в оболочке:

  • POSIX: t = $ {t%?}
  • Борн: t = `expr" $ t ": '\ (. * \).'`
  • zsh / yash: t = $ {t [1, -2]}
  • bash / zsh: t = $ {t: 0: -1}
  • ksh93 / bash / zsh / mksh : t = $ {t: 0: $ {# t} -1}
  • ksh93 / bash / zsh / mksh: t = $ {t /%?}
  • ksh93: t = $ {t / ~ (E). $ /}
  • es: @ {t = $ 1} ~~ $ t *?

Обратите внимание, что хотя все должны удалить последний ] символа , вы обнаружите, что некоторые реализации (те, которые не поддерживают многобайтовые символы) вместо этого удаляют последний байт (поэтому, вероятно, будет поврежден последний символ, если он был многобайтовым ).

Вариант expr предполагает, что $ t не заканчивается более чем одним символом новой строки. Он также вернет ненулевой статус выхода, если результирующая строка окажется 0 (или 000 или даже -0 в некоторых реализациях). Это также может дать неожиданные результаты, если строка содержит недопустимые символы.

47
27.01.2020, 19:28

В ksh:

echo ${ORACLE_SID/%?/}
-1
27.01.2020, 19:28

Самый переносимый и самый короткий ответ почти наверняка:

$ {t%?}

Это работает в bash, sh, ash, dash, busybox / ash, zsh, ksh и т. д.

Он работает с использованием устаревшего расширения параметров оболочки. В частности, % указывает на удаление наименьшего совпадающего суффикса параметра t , который соответствует шаблону глобуса ? (то есть: любому символу).

См. «Удалить наименьший шаблон суффикса» здесь для (гораздо) более подробного объяснения и дополнительной информации. Также см. Документацию по вашей оболочке (например: man bash ) в разделе «Расширение параметров».


В качестве примечания: если вы хотите вместо этого удалить первый символ , вы должны использовать $ {t #?} , поскольку # соответствует из перед строкой (префикс) вместо задней (суффикс).

Также стоит отметить, что и % , и # имеют версии %% и ## , которые соответствуют самая длинная версия данного паттерна вместо самой короткой. Оба $ {t %%?} и $ {t ##?} в этом случае будут делать то же самое, что и их единственный оператор (так что не добавляйте бесполезные лишние персонаж). Это связано с тем, что данный шаблон ? соответствует только одному символу. Смешайте * с некоторыми не подстановочными знаками, и все станет более интересным с %% и ## .

Понимание расширений параметров или, по крайней мере, знание об их существовании и умение их искать, невероятно полезно для написания и расшифровки сценариев оболочки многих разновидностей. Расширения параметров часто выглядят для многих как загадочная оболочка-вуду, потому что ... ну ... они загадочная оболочка-вуду (хотя довольно хорошо задокументированы, если вы знаете, что нужно искать "расширение параметров"). Тем не менее, определенно хорошо иметь пояс с инструментами, когда вы застряли в снаряде.

32
27.01.2020, 19:28

Поскольку мы также можем использовать php в командной строке или сценариях оболочки. Иногда это полезно для хирургического разбора.

php -r "echo substr('Hello', 0, -1);" 
// Output hell

С трубопроводом:

echo "hello" | php -r "echo substr(trim(fgets(STDIN)), 0, -1);"
// Output hell
1
27.01.2020, 19:28

Теги

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