Posso forse usare <
o >
o |
. Forse devo usare grep?
Posso forse usare <
o >
o |
. Forse devo usare grep?
Risposte:
Puoi creare una funzione e aggiungerla alla fine ~/.bashrc
, ad esempio:
nodot() { echo "$1" | sed 's/\./ /g' ; }
esempio di utilizzo:
$ nodot foo.foo.foo
foo foo foo
Puoi usare questa funzione anche in zsh, basta aggiungerla al tuo ~/.zshrc
.
È possibile utilizzare il comando tr per convertire il carattere.
% echo "foo.foo.foo" | tr '.' ' '
foo foo foo
tr
è in realtà pensato proprio per questo scopo. sed
è eccessivo.
tr
, che è uno strumento molto utile che molte persone non sembrano conoscere per qualche motivo. Molto più semplice rispetto sed
alla conversione di intere classi di caratteri.
Utilizzando Internal Field Separator (IFS)
variabile:
bash-4.3$ old_ifs=$IFS
bash-4.3$ IFS="."
bash-4.3$ var="foo.foo.foo"
bash-4.3$ echo $var
foo foo foo
bash-4.3$ IFS=$old_ifs
Questo può essere messo bene in una funzione:
split_dot()
{
string="$1"
if set | grep -q "IFS";
then
ifs_unset="false"
old_ifs=$IFS
else
ifs_unset="true"
fi
IFS="."
echo $string
if [ "$ifs_unset" == "true" ];
then
unset IFS
else
IFS=$old_ifs
fi
}
Ed esegui così:
bash-4.3$ split_dot "foo.baz.bar"
foo baz bar
IFS
è più complicato del semplice salvataggio in una variabile e ripristino del valore. Un non impostato IFS
e uno vuoto IFS
hanno un comportamento diverso, quindi è necessario verificare se non è impostato o è vuoto, nel caso in cui fosse vuoto prima.
local
parola chiave.
IFS
per qualche motivo in precedenza, questa funzione lo avrebbe impostato su vuoto, il che ha un comportamento diverso.
(IFS=.; echo ...)
. Poiché questa risposta utilizzava una funzione, Serg poteva semplicemente cambiare le parentesi graffe tra parentesi e non preoccuparsi di ripristinare l'IFS
Chiunque ha perso awk
/ perl
/ python
/ go
:
% awk '{gsub(/[.]/, " ", $0); print}' <<<'foo.foo.foo'
foo foo foo
% perl -pe 's/\./ /g' <<<'foo.foo.foo'
foo foo foo
% python -c 'import sys; print sys.stdin.read().replace(".", " ")' <<<'foo.foo.foo'
foo foo foo
% cat input.go
package main
import (
"os"
"strings"
"fmt"
)
func main () {
args := os.Args
if len(args) != 2 {
fmt.Println("Not enough arguments")
return
}
out := strings.Replace(args[1], ".", " ", -1)
fmt.Println(out)
}
% go run input.go 'foo.foo.foo'
foo foo foo
echo "foo.foo.foo" | sed 's/\./ /g'