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 ~/.zshrc
place.
Vous pouvez utiliser la commande tr pour convertir le caractère.
% echo "foo.foo.foo" | tr '.' ' '
foo foo foo
tr
est en fait destiné exactement à cet effet. sed
est 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 sed
pour 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
IFS
est plus délicate que de simplement l'enregistrer dans une variable et de restaurer la valeur. Un non défini IFS
et un vide IFS
ont 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.
local
mot - clé.
IFS
pour 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'