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 sedalla 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 IFSe uno vuoto IFShanno un comportamento diverso, quindi è necessario verificare se non è impostato o è vuoto, nel caso in cui fosse vuoto prima.
localparola chiave.
IFSper 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'