Was meinst du mit einem Text? eine Datei oder ein Text in einer Datei? echo "foo.foo.foo" | sed 's/\./ /g'
Zanna
1
@KDG i) Sie müssen für jede SE-Site ein separates Konto erstellen. Wenn Sie jedoch dieselben Anmeldeinformationen verwenden, werden die Konten verknüpft. ii) Obwohl diese Seite in der Tat ausschließlich auf Ubuntu beschränkt ist, sehe ich hier nichts, was einen unwiderlegbaren Beweis dafür darstellen würde, dass Sie Ubuntu nicht verwenden. Daher sehe ich auch keinen Grund, sie zu schließen.
Terdon
Antworten:
20
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 ~/.zshrcverwenden. Fügen Sie stattdessen einfach Ihre hinzu .
trist eigentlich genau für diesen Zweck gedacht. sedist übertrieben.
Max Ried
1
+1 genau für tr, was ein sehr nützliches Werkzeug ist, von dem viele Leute aus irgendeinem Grund nichts zu wissen scheinen. Viel einfacher als sedzum Konvertieren ganzer Zeichenklassen.
flauschige
5
Schreiben Sie es niemals in 'C', wenn Sie es in 'awk' tun können. Mach es niemals in 'awk', wenn 'sed' damit umgehen kann; Verwenden Sie niemals 'sed', wenn 'tr' die Arbeit erledigen kann. Rufen Sie niemals 'tr' auf, wenn 'cat' ausreicht. Vermeiden Sie nach Möglichkeit die Verwendung von "Katze". - Taylors Programmiergesetze
Ross Presser
1
Gute Antwort. Diese Antwort sollte akzeptiert werden.
SuB
24
Mit reinem Bash:
bash-3.2$ a='a.a.a'
bash-3.2$ echo "${a/./ }"
a a.a
bash-3.2$ echo "${a//./ }"
a a a
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
}
Das Zurücksetzen IFSist schwieriger als nur das Speichern in einer Variablen und das Wiederherstellen des Werts. Ein nicht gesetztes IFSund ein leeres IFSVerhalten haben ein unterschiedliches Verhalten. Sie müssen daher überprüfen, ob es nicht gesetzt oder nur leer ist, falls es zuvor leer war.
Wenn OP zuvor IFSaus irgendeinem Grund deaktiviert worden wäre, würde diese Funktion es auf leer setzen, was ein anderes Verhalten aufweist.
Muru
2
@fedorqui leider funktioniert auch das nicht; da der IFS-Wert für die zu analysierende aktuelle Anweisung zu spät eingestellt ist. Sie müssten tatsächlich eine Unterschale verwenden (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
Muru
2
@ Fedorqui Sie könnten meine ähnliche Frage auf U & L interessant finden: unix.stackexchange.com/q/264635/70524 (Gilles gibt immer sehr gute Antworten)
echo "foo.foo.foo" | sed 's/\./ /g'
Antworten:
Sie können eine Funktion erstellen und am Ende Ihrer hinzufügen
~/.bashrc
, zum Beispiel:Anwendungsbeispiel:
Sie können diese Funktion auch in zsh
~/.zshrc
verwenden. Fügen Sie stattdessen einfach Ihre hinzu .quelle
Sie können den Befehl tr verwenden , um Zeichen zu konvertieren.
quelle
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 alssed
zum Konvertieren ganzer Zeichenklassen.Mit reinem Bash:
quelle
Mit
Internal Field Separator (IFS)
Variable:Dies kann gut in eine Funktion eingefügt werden:
Und lauf so:
quelle
IFS
ist schwieriger als nur das Speichern in einer Variablen und das Wiederherstellen des Werts. Ein nicht gesetztesIFS
und ein leeresIFS
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 machenWer verpasst
awk
/perl
/python
/go
:quelle
Man kann
xargs
auch verwenden. Hier ist ein Einzeiler mitxargs
quelle