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.
trper stringhe lunghe. Sul mio sistematrsupera bash a partire da stringhe con più di1000caratteri. 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)trprese0.04se prese bash 5.0.1117s. Con 2M hatrpreso0.07s(previsto) ma bash ha richiesto69s(4 volte più lungo per il doppio della lunghezza della stringa).