Bash 4.3 Lunghezza negativa sottostringa su OS X


12

Bash 4.2 ha aggiunto il supporto per lunghezze di sottostringa negative:

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

Esempio 37-12. Parametro negativo nel costrutto di estrazione di stringhe

Quando il parametro "lunghezza" è negativo, funge da parametro offset-da-fine.

Ad esempio, i seguenti output "World" quando testati su Ubuntu:

STR="Hello World!"
echo ${STR:6:-1}

Ma in OS X (GNU bash, versione 4.3.42 (1) -release (x86_64-apple-darwin14.5.0)), quell'utilizzo produce il seguente errore:

-1: substring expression < 0

Questo OS X è specifico o è stato nuovamente disabilitato negli aggiornamenti bash successivi? C'è un modo per abilitare questa funzionalità per OS X?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - cosa è stato aggiunto quando, a partire da v2, v3 e v4 segue.
Hannu,

@Hannu sì, quel documento afferma che la semantica della lunghezza negativa è stata aggiunta nella versione 4.2
Brent Faust

Ho lo stesso problema: hai trovato un modo per affrontarlo?
Romain Jouin,

@romainjouin Solo cambiando l'algoritmo. Questa sintassi non funziona con OX X, anche a partire dalla versione 4.3.46 di Bash! Vota in alto la domanda per cercare di avere più occhi su questo. Qualcuno conosce la risposta ...
Brent Faust,

1
@Rubistro Basta colpire questo: | Un modo per echo "Hello World" | rev | cut -c -5 | rev
aggirarlo

Risposte:


7

Mentre la soluzione di flabdablet funziona solo per stringhe a lunghezza fissa, puoi usarla come sostituzione drop-in per stringhe di dimensioni dinamiche:

echo ${STR:6:$((${#STR} - 6 - 1))}

In dettaglio:

  • ${#STR} restituisce la lunghezza della stringa.
  • $((a - b - c)) fa sottrazione matematica
  • ${STR:start:len} restituisce una sottostringa.

Quindi combinato il secondo argomento all'espressione di sottostringa è la lunghezza della stringa meno l'offset iniziale meno il valore che si dovrebbe specificare come valore negativo nella nuova sintassi bash.


2

$ {STR: 6: $ {# STR} -7} dovrebbe essere una sostituzione drop-in funzionante per $ {STR: 6: -1} se STR è garantito che contenga almeno 7 caratteri. Se potrebbe essere più breve, questo causerà anche OS X bash a lamentarsi delle lunghezze negative, o andrà terribilmente male nelle versioni bash che supportano le lunghezze negative che vengono prese come offset da destra.


Grazie, ha fatto il trucco per me
Jean-Bernard Jansen il

0

Googled da qui :

Dicono che ${STR:6:$#-1}dovrebbe funzionare bene

Nel mio caso, con un errore simile ${VERSION::-2}, semplicemente hanno iniziato a lavorare dopo l'aggiunta di 0 in questo modo: ${VERSION:0:-2}.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.