Co rozumiesz przez tekst? plik lub tekst w pliku? echo "foo.foo.foo" | sed 's/\./ /g'
Zanna,
1
@KDG i) musisz utworzyć osobne konto dla każdej witryny SE, ale jeśli użyjesz tych samych danych logowania, konta zostaną połączone. ii) Chociaż ta strona jest rzeczywiście ograniczona wyłącznie do Ubuntu, nie widzę tutaj niczego, co stanowiłoby niezbity dowód, że nie używasz Ubuntu, więc nie widzę też powodu, aby ją zamykać.
terdon
Odpowiedzi:
20
Możesz utworzyć funkcję i dodać na końcu swojego ~/.bashrc, na przykład:
nodot() { echo "$1" | sed 's/\./ /g' ; }
przykład użycia:
$ nodot foo.foo.foo
foo foo foo
Możesz użyć tej funkcji również w zsh, po prostu dodaj do niej ~/.zshrc.
fajne wskazówki nigdy wcześniej nie słyszały o „tr”
KDG
6
trjest właściwie przeznaczony właśnie do tego celu. sedto przesada.
Max Ried
1
+1 za tr, co jest bardzo przydatnym narzędziem, o którym wiele osób nie wie z jakiegoś powodu. O wiele prostsze niż w sedprzypadku konwertowania całych klas znaków.
puszysty
5
Nigdy nie pisz tego w „C”, jeśli możesz to zrobić w „awk”; Nigdy nie rób tego w „awk”, jeśli „sed” sobie z tym poradzi; Nigdy nie używaj „sed”, gdy „tr” może wykonać zadanie; Nigdy nie wzywaj „tr”, gdy „kot” jest wystarczający; Jeśli to możliwe, unikaj używania „kota”. - Zasady programowania Taylora
Ross Presser,
1
Niezła odpowiedź. Ta odpowiedź powinna zostać zaakceptowana.
SuB
24
Używając czystej 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
}
Resetowanie IFSjest trudniejsze niż zapisanie go w zmiennej i przywrócenie wartości. Rozbrojone IFSi puste IFSmają inne zachowanie, więc musisz sprawdzić, czy jest rozbrojone, czy tylko puste, na wypadek gdyby wcześniej było puste.
Więc jeśli OP IFSz jakiegoś powodu wcześniej się rozbroił, ta funkcja ustawiłaby go na pusty, co ma inne zachowanie.
mur
2
@fedorqui niestety nawet to nie zadziała; ponieważ wartość IFS jest ustawiona zbyt późno, aby można było przeanalizować bieżącą instrukcję. Będziesz musiał użyć podpowłoki (IFS=.; echo ...). Ponieważ w tej odpowiedzi użyto funkcji, Serg mógł po prostu zmienić nawiasy klamrowe w nawiasy i nie martwić się zresetowaniem IFS
echo "foo.foo.foo" | sed 's/\./ /g'
Odpowiedzi:
Możesz utworzyć funkcję i dodać na końcu swojego
~/.bashrc
, na przykład:przykład użycia:
Możesz użyć tej funkcji również w zsh, po prostu dodaj do niej
~/.zshrc
.źródło
Możesz użyć polecenia tr do konwersji znaków.
źródło
tr
jest właściwie przeznaczony właśnie do tego celu.sed
to przesada.tr
, co jest bardzo przydatnym narzędziem, o którym wiele osób nie wie z jakiegoś powodu. O wiele prostsze niż wsed
przypadku konwertowania całych klas znaków.Używając czystej bash:
źródło
Za pomocą
Internal Field Separator (IFS)
zmiennej:Można to ładnie włączyć w funkcję:
I działaj tak:
źródło
IFS
jest trudniejsze niż zapisanie go w zmiennej i przywrócenie wartości. RozbrojoneIFS
i pusteIFS
mają inne zachowanie, więc musisz sprawdzić, czy jest rozbrojone, czy tylko puste, na wypadek gdyby wcześniej było puste.local
słowo kluczowe.IFS
z jakiegoś powodu wcześniej się rozbroił, ta funkcja ustawiłaby go na pusty, co ma inne zachowanie.(IFS=.; echo ...)
. Ponieważ w tej odpowiedzi użyto funkcji, Serg mógł po prostu zmienić nawiasy klamrowe w nawiasy i nie martwić się zresetowaniem IFSKtoś przegapił
awk
/perl
/python
/go
:źródło
Można
xargs
również użyć . Oto użycie jednej linijkixargs
źródło