Vraag Bash verwijder de eerste en laatste karakters uit een string


Ik heb zo'n string:

|abcdefg|

En ik wil een nieuwe string krijgen die op een bepaalde manier wordt aangeroepen (zoals string2) met de originele string zonder de twee | aan het begin en aan het einde ervan

zodat ik dit heb

abcdefg

is dat mogelijk in bash?


77
2017-12-23 14:29


oorsprong




antwoorden:


Je kunt doen

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

Of als uw reekslengte constant is, kunt u doen

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

Dit zou ook moeten werken

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

Dit ook

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

106
2017-12-23 14:49



en ook awk -F\| '{ print $2 }' <<<"|string|" - enzotib
@enzotib Je hebt altijd cool awk oplossingen. ik moet leren awk. - Kris Harper
en ook IFS='|' read string2 <<< $string :) - arrange
en ook, in bash 4.2 en nieuwer, "${string:1:-1}" - geirha
Lees in het gedeelte "parameteruitbreiding" in man bash. - Nemo


Hier is een oplossing die onafhankelijk is van de lengte van de string (bash):

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

52
2017-12-24 16:28





Als je een paar berichten hier opgeeft, lijkt dit de eenvoudigste manier om het te doen:

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

edit: werkt op ubuntu met bash 4.2; werkt niet op centOS met bash 4.1


18
2017-09-05 20:37





En nog een:

string="|abcdefg|"
echo "${string//|/}"

10
2018-06-09 01:03





Een andere manier met hoofd en staart:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -1
abcdefg

9
2017-11-26 16:16



Ik had een reeks van [something something] met een doel om haakjes te knippen, dus echo "[something something]" | tail -c +2 | head -c -2 uitgewerkt. Bedankt voor een tip! - Ain Tohvri


Je kunt sed ook gebruiken om de | te verwijderen niet alleen refereren aan het symbool zelf maar het gebruik van positionele referenties zoals in:

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

Waar ':' de scheidingstekens zijn (u kunt ze vervangen door / of elk teken dat niet in de query voorkomt, elk teken dat volgt op de s zal het doen) Hier ^ (caret) betekent aan het begin van de invoerreeks en $ (dollar) betekent aan het einde. De . (punt) dat het naar de caret en degene die het is voordat het dollarteken een enkel karakter vertegenwoordigt. Dus met andere woorden, we verwijderen de eerste en laatste tekens. Houd er rekening mee dat hierdoor alle tekens worden verwijderd, zelfs als | het is niet aanwezig in de string.

EX:

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

8
2018-02-08 01:44





shell-functie

Een wat meer uitgebreide benadering, maar werkt op elk soort eerste en laatste personage, hoeft niet hetzelfde te zijn. Het basisidee is dat we een variabele nemen, karakter per teken lezen en alleen die toevoegen we willen een nieuwe variabele

Hier is dat hele idee geformatteerd in een leuke functie

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 
}

En hier is diezelfde functie in actie:

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

Python

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

of op de opdrachtregel:

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

AWK

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

Robijn

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg

2
2018-04-06 13:58





Kleine en universele oplossing:

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

Speciaal in dit geval en toestaan ​​dat de '|' karakter kan er zijn of niet:

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

1
2017-07-08 23:29