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
trjest właściwie przeznaczony właśnie do tego celu. sedto przesada.
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.
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
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.
localsłowo kluczowe.
IFSz 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'