Ich kann vielleicht <
oder >
oder verwenden |
. Vielleicht muss ich grep verwenden?
Ich kann vielleicht <
oder >
oder verwenden |
. Vielleicht muss ich grep verwenden?
Antworten:
Sie können eine Funktion erstellen und am Ende Ihrer hinzufügen ~/.bashrc
, zum Beispiel:
nodot() { echo "$1" | sed 's/\./ /g' ; }
Anwendungsbeispiel:
$ nodot foo.foo.foo
foo foo foo
Sie können diese Funktion auch in zsh ~/.zshrc
verwenden. Fügen Sie stattdessen einfach Ihre hinzu .
Sie können den Befehl tr verwenden , um Zeichen zu konvertieren.
% echo "foo.foo.foo" | tr '.' ' '
foo foo foo
tr
ist eigentlich genau für diesen Zweck gedacht. sed
ist übertrieben.
tr
, was ein sehr nützliches Werkzeug ist, von dem viele Leute aus irgendeinem Grund nichts zu wissen scheinen. Viel einfacher als sed
zum Konvertieren ganzer Zeichenklassen.
Mit 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
Dies kann gut in eine Funktion eingefügt werden:
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
}
Und lauf so:
bash-4.3$ split_dot "foo.baz.bar"
foo baz bar
IFS
ist schwieriger als nur das Speichern in einer Variablen und das Wiederherstellen des Werts. Ein nicht gesetztes IFS
und ein leeres IFS
Verhalten haben ein unterschiedliches Verhalten. Sie müssen daher überprüfen, ob es nicht gesetzt oder nur leer ist, falls es zuvor leer war.
local
Schlüsselwort.
IFS
aus irgendeinem Grund deaktiviert worden wäre, würde diese Funktion es auf leer setzen, was ein anderes Verhalten aufweist.
(IFS=.; echo ...)
. Da diese Antwort eine Funktion verwendete, konnte Serg einfach die geschweiften Klammern in Klammern ändern und sich keine Gedanken über das Zurücksetzen von IFS machen
Wer verpasst 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'