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

79

У меня есть строка вроде этого:

|abcdefg|

И я хочу получить новую строку, вызванную каким-то образом (например, string2), с исходной строкой без двух | в начале и в конце его

, так что я буду иметь это

abcdefg

возможно в bash?

    
задан Matteo Pagliazzi 23.12.2011 в 15:29
источник

8 ответов

106

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

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/^|\(.*\)|$//'
    
ответ дан Kris Harper 23.12.2011 в 15:49
источник
54

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

string="|abcdefg|"
echo "${string:1:${#string}-2}"
    
ответ дан Samus_ 24.12.2011 в 17:28
20

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

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

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

    
ответ дан jlunavtgrad 05.09.2012 в 22:37
10

И еще один:

string="|abcdefg|"
echo "${string//|/}"
    
ответ дан Steven Penny 09.06.2012 в 03:03
10

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

$ echo -n "|abcdefg|" | tail -c +2 | head -c -1
abcdefg
    
ответ дан Zavior 26.11.2013 в 17:16
8

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

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

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

Пример:

$ echo "abcdefg" | sed 's:^.\(.*\).$::'
bcdef
    
ответ дан Metafaniel 08.02.2012 в 02:44
2

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

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

Вот эта целая идея, отформатированная в приятную функцию

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 -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg
    
ответ дан Sergiy Kolodyazhnyy 06.04.2016 в 15:58
1

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

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

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

expr "|abcdef" : '|*\([^|]*\)|*'
    
ответ дан Tosi Do 09.07.2017 в 01:29