Bash menghapus pertama dan karakter terakhir dari string

Aku punya string seperti itu:

|abcdefg|

Dan aku ingin mendapatkan string baru yang disebut di bagaimanapun (seperti string2) dengan string asli tanpa dua karakter | di awal dan di akhir itu sehingga saya akan memiliki ini:

abcdefg

Mungkin di bash?

Larutan

Yang dapat anda lakukan

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

Atau jika panjang string adalah konstan, yang dapat anda lakukan

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

Juga, ini harus bekerja

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

Juga ini

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
Komentar (5)

Berikut ini's solusi yang independen dari panjang string (bash):

string="|abcdefg|"
echo "${string:1:${#string}-2}"
Komentar (0)

Pergi beberapa tulisan yang tercantum di sini tampaknya cara yang paling sederhana untuk melakukannya adalah:

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

edit: bekerja pada ubuntu dengan bash 4.2; tidak bekerja pada centOS dengan bash 4.1

Komentar (0)

Cara lain adalah dengan menggunakan kepala & ekor perintah:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
Komentar (2)

Dan satu lagi:

string="|abcdefg|"
echo "${string//|/}"
Komentar (0)

Anda juga dapat menggunakan sed untuk menghapus | tidak hanya referensi simbol itu sendiri tetapi menggunakan posisi sebagai referensi dalam:

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

Mana ':' adalah pembatas (anda dapat menggantinya dengan / atau setiap karakter tidak dalam permintaan, ada tanda-tanda berikut s akan melakukan itu) di Sini ^ (caret) berarti pada awal masukan string dan $ (dolar) berarti di akhir. Yang . (titik) itu's setelah karet dan satu yang's sebelum tanda dolar mewakili satu karakter. Jadi dengan kata lain kita menghapus pertama dan karakter terakhir. Di pikiran ini akan menghapus semua karakter bahkan jika | it's tidak hadir dalam string.

EX:

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

fungsi shell

Sedikit lebih verbose pendekatan, tetapi bekerja pada setiap jenis pertama dan karakter terakhir, doesn't harus sama. Ide dasar adalah bahwa kita mengambil variabel, membaca karakter demi karakter, dan menambahkan hanya orang-orang kita ingin variabel baru

Berikut ini's bahwa seluruh ide diformat ke dalam fungsi bagus


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 
Komentar (0)

Kecil dan universal solusi:

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

Khusus dalam kasus ini dan memungkinkan bahwa '|' karakter yang mungkin ada atau tidak:

expr "|abcdef" : '|*\([^|]*\)|*'
Komentar (0)

$ string="|abcdefg|" $ string="${string#?}" && string="${string%%?}" $ echo "$string" abcdefg

Dari http://tldp.org/LDP/abs/html/parameter-substitution.html

${var#Pola} Hapus dari $var yang singkat bagian dari $Pola yang sesuai dengan front end dari $var. ${var%%Pola} Hapus dari $var yang terpanjang bagian dari $Pola yang sesuai dengan belakang dari $var.

Komentar (0)

Anda dapat menggunakan ini:

echo "|abcdefg|" | tr -d "|"

Dengan baris kode, anda menghapus semua |->(pipa) dalam string.

Komentar (0)