Bash rimuove il primo e l'ultimo carattere da una stringa

81

Ho una stringa del genere:

|abcdefg|

E voglio ottenere una nuova stringa chiamata in qualche modo (come stringa2) con la stringa originale senza i due | all'inizio e alla fine di esso

così avrò questo

abcdefg

è possibile in bash?

    
posta Matteo Pagliazzi 23.12.2011 - 15:29

8 risposte

107

Puoi fare

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

O se la lunghezza della tua stringa è costante, puoi fare

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

Inoltre, dovrebbe funzionare

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

Anche questo

echo "|abcdefg|" | sed 's/^|\(.*\)|$//'
    
risposta data Kris Harper 23.12.2011 - 15:49
57

Ecco una soluzione indipendente dalla lunghezza della stringa (bash):

string="|abcdefg|"
echo "${string:1:${#string}-2}"
    
risposta data Samus_ 24.12.2011 - 17:28
21

Se rimuovi alcuni post qui elencati, sembra che il modo più semplice per farlo sia:

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

edit: funziona su ubuntu con bash 4.2; non funziona su centOS con bash 4.1

    
risposta data jlunavtgrad 05.09.2012 - 22:37
10

E un altro:

string="|abcdefg|"
echo "${string//|/}"
    
risposta data Steven Penny 09.06.2012 - 03:03
10

Un altro modo con head & amp; coda:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -1
abcdefg
    
risposta data Zavior 26.11.2013 - 17:16
8

Puoi anche usare sed per rimuovere il | non solo facendo riferimento al simbolo stesso ma usando riferimenti posizionali come in:

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

Dove ':' sono i delimitatori (è possibile sostituirli con / o qualsiasi carattere non presente nella query, qualsiasi segno che segue i s lo farà) Qui ^ (caret) significa all'inizio della stringa di input e $ ( dollaro) significa alla fine. Il . (punto) che è dopo il segno di omissione e quello che è prima che il simbolo del dollaro rappresenti un singolo carattere. Quindi, in altre parole, stiamo eliminando il primo e l'ultimo carattere. Ricorda che cancellerà qualsiasi carattere anche se | non è presente nella stringa.

EX:

$ echo "abcdefg" | sed 's:^.\(.*\).$::'
bcdef
    
risposta data Metafaniel 08.02.2012 - 02:44
2

funzione shell

Un approccio un po 'più verboso, ma funziona su qualsiasi tipo di primo e ultimo carattere, non deve essere lo stesso. L'idea di base è che stiamo prendendo una variabile, leggendola carattere per carattere e aggiungendo solo quelle vogliamo una nuova variabile

Ecco l'intera idea formattata in una bella funzione

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 
}

Ed ecco la stessa funzione in azione:

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

Python

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

o sulla riga di comando:

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

AWK

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

Rubino

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg
    
risposta data Sergiy Kolodyazhnyy 06.04.2016 - 15:58
1

Soluzione piccola e universale:

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

Speciale in questo caso e consentendo che il '|' il personaggio potrebbe essere lì o no:

expr "|abcdef" : '|*\([^|]*\)|*'
    
risposta data Tosi Do 09.07.2017 - 01:29

Leggi altre domande sui tag