Mogę być może używać <
albo >
albo |
. Może muszę użyć grep?
Mogę być może używać <
albo >
albo |
. Może muszę użyć grep?
Odpowiedzi:
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
.
Możesz użyć polecenia tr do konwersji znaków.
% echo "foo.foo.foo" | tr '.' ' '
foo foo foo
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ż w sed
przypadku konwertowania całych klas znaków.
Za pomocą Internal Field Separator (IFS)
zmiennej:
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
Można to ładnie włączyć w funkcję:
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
}
I działaj tak:
bash-4.3$ split_dot "foo.baz.bar"
foo baz bar
IFS
jest trudniejsze niż zapisanie go w zmiennej i przywrócenie wartości. Rozbrojone IFS
i puste IFS
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 IFS
Ktoś przegapił 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'