Bash удаляет первый и последний символы из строки

У моего ноутбука очень (очень) подобные системные требования. Тот же жесткий диск, то же RAM и почти тот же процессор, и он очень хорошо работает с Ubuntu. Похоже, что этот ноутбук будет отлично работать с Ubuntu 14.04, как и мой.

79
задан 23 December 2011 в 20:48

8 ответов

Вы можете сделать

string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2

Или, если длина строки постоянна, вы можете сделать

string="|abcdefg|"
string2=${string:1:7}
echo $string2

Кроме того, это должно работать

echo "|abcdefg|" | cut -d "|" -f 2

Также этот

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
101
ответ дан 25 May 2018 в 15:43

Вот решение, которое не зависит от длины строки (bash):

string="|abcdefg|"
echo "${string:1:${#string}-2}"
47
ответ дан 25 May 2018 в 15:43

Отключение нескольких сообщений, перечисленных здесь, кажется, самый простой способ сделать это:

string="|abcdefg|"
echo ${string:1:-1}

edit: работает на ubuntu с bash 4.2; не работает на centOS с bash 4.1

16
ответ дан 25 May 2018 в 15:43

И еще один:

string="|abcdefg|"
echo "${string//|/}"
10
ответ дан 25 May 2018 в 15:43

Другой способ с головкой & amp; tail:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -1
abcdefg
8
ответ дан 25 May 2018 в 15:43
  • 1
    У меня была строка [something something] с целью сокращения скобок, поэтому echo "[something something]" | tail -c +2 | head -c -2 отработал. Спасибо за подсказку! – Ain Tohvri 13 December 2015 в 19:36

Вы также можете использовать sed для удаления | не только ссылаясь на сам символ, но и используя позиционные ссылки, как в:

$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg

Где ':' - разделители (вы можете заменить их / или любого символа, не содержащегося в запросе, любой знак, следующий за s сделаем это) Здесь ^ (карет) означает в начале входной строки и $ (доллар) означает в конце. . (point), что после каретки и той, что она есть до того, как знак доллара представляет собой один символ. Иными словами, мы удаляем первый и последний символы. Имейте в виду, что это удалит любые символы, даже если | его нет в строке.

EX:

$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
7
ответ дан 25 May 2018 в 15:43

Функция оболочки

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

. Вот что вся идея отформатирована в приятную функцию

crop_string_ends() {
    STR="$1" 
    NEWSTR="" 
    COUNT=0 
    while read -n 1 CHAR 
    do
        COUNT=$(($COUNT+1)) 
        if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ] 
        then
            continue 
        fi 
        NEWSTR="$NEWSTR"$CHAR 
    done <<<"$STR" 
    echo $NEWSTR 
}

И вот та же самая функция в действии:

$> crop_string_ends "|abcdefg|"                                                                                       
abcdefg
$> crop_string_ends "HelloWorld"                                                                                      
elloWorl

Python

>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg

или в командной строке:

$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"                                             
abcdefg

AWK

$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'                                                      
abcdefg

Ruby

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg
2
ответ дан 25 May 2018 в 15:43

Малое и универсальное решение:

expr "|abcdef|" : '.\(.*\).'

Специально в этом случае и разрешая, что '|' символ может быть там или нет:

expr "|abcdef" : '|*\([^|]*\)|*'
1
ответ дан 25 May 2018 в 15:43

Другие вопросы по тегам:

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