Je peux peut-être utiliser <ou >ou |. Peut-être que je dois utiliser grep?
Je peux peut-être utiliser <ou >ou |. Peut-être que je dois utiliser grep?
Réponses:
Vous pouvez créer une fonction et ajouter à la fin de votre ~/.bashrc, par exemple:
nodot() { echo "$1" | sed 's/\./ /g' ; }
exemple d'utilisation:
$ nodot foo.foo.foo
foo foo foo
Vous pouvez également utiliser cette fonction dans zsh, ajoutez-la simplement à votre ~/.zshrcplace.
Vous pouvez utiliser la commande tr pour convertir le caractère.
% echo "foo.foo.foo" | tr '.' ' '
foo foo foo
trest en fait destiné exactement à cet effet. sedest exagéré.
tr, qui est un outil très utile que beaucoup de gens ne semblent pas connaître pour une raison quelconque. Bien plus simple que sedpour convertir des classes entières de caractères.
Utilisation de Internal Field Separator (IFS)variable:
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
Cela peut être joliment mis dans une fonction:
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
}
Et exécutez comme suit:
bash-4.3$ split_dot "foo.baz.bar"
foo baz bar
IFSest plus délicate que de simplement l'enregistrer dans une variable et de restaurer la valeur. Un non défini IFSet un vide IFSont un comportement différent, vous devez donc vérifier s'il est non défini ou simplement vide, au cas où il était vide auparavant.
localmot - clé.
IFSpour une raison quelconque, cette fonction le mettrait à vide, ce qui a un comportement différent.
(IFS=.; echo ...). Puisque cette réponse utilisait une fonction, Serg pourrait simplement changer les accolades en parenthèses et ne pas s'inquiéter de réinitialiser IFS du tout
Quelqu'un a manqué 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'