Devo riuscire a sostituire uno spazio ( ) con un punto (
.
) in una stringa in bash.
Penso che sarebbe abbastanza semplice, ma sono nuovo, quindi non riesco a capire come modificare un esempio simile per questo uso.
Devo riuscire a sostituire uno spazio ( ) con un punto (
.
) in una stringa in bash.
Penso che sarebbe abbastanza semplice, ma sono nuovo, quindi non riesco a capire come modificare un esempio simile per questo uso.
Risposte:
Usa la sostituzione della stringa di shell in linea. Esempio:
foo=" "
# replace first blank only
bar=${foo/ /.}
# replace all blanks
bar=${foo// /.}
Vedi http://tldp.org/LDP/abs/html/string-manipulation.html per maggiori dettagli.
tr
! ... A seconda della memoria disponibile e delle risorse hw ... Ma hai ragione !: A seconda del tipo di lavoro da svolgere, gli strumenti dedicati rimangono più efficienti!
$'\n'
È possibile utilizzare tr
, in questo modo:
tr " " .
Esempio:
# echo "hello world" | tr " " .
hello.world
Da man tr
:
DESCRIZIONE
Traduci, stringi e / o elimina i caratteri dall'input standard, scrivendo nell'output standard.
In bash, puoi eseguire la sostituzione del pattern in una stringa con il ${VARIABLE//PATTERN/REPLACEMENT}
costrutto. Utilizzare solo /
e non //
per sostituire solo la prima occorrenza. Il modello è un modello jolly, come globs di file.
string='foo bar qux'
one="${string/ /.}" # sets one to 'foo.bar qux'
all="${string// /.}" # sets all to 'foo.bar.qux'
Usa la sostituzione dei parametri:
string=${string// /.}
Prova questo per i percorsi:
echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'
Sostituisce lo spazio all'interno della stringa tra virgolette doppie con un +
canto, quindi sostituisce il+
segno con una barra rovesciata, quindi rimuove / sostituisce le virgolette doppie.
Ho dovuto usare questo per sostituire gli spazi in uno dei miei percorsi in Cygwin.
echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'
sed
. Le virgolette sono irrilevanti.
tr
per stringhe lunghe. Sul mio sistematr
supera bash a partire da stringhe con più di1000
caratteri. Sembra che la complessità temporale di Bash sia peggiore di quella lineare. Un piccolo test:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. Con una lunghezza della stringa di 1M (= 2 ^ 20)tr
prese0.04s
e prese bash 5.0.1117s
. Con 2M hatr
preso0.07s
(previsto) ma bash ha richiesto69s
(4 volte più lungo per il doppio della lunghezza della stringa).