如何让bash / zsh用脚本/别名将一些文本从“foo.foo.foo”更改为“foo foo foo”?

我可以使用<>| 。 也许我需要使用grep?

你可以创建一个函数并添加到~/.bashrc的末尾,例如:

 nodot() { echo "$1" | sed 's/\./ /g' ; } 

用法示例:

 $ nodot foo.foo.foo foo foo foo 

您也可以在zsh中使用此function,只需添加到~/.zshrc

您可以使用tr命令转换字符。

 % echo "foo.foo.foo" | tr '.' ' ' foo foo foo 

使用纯bash:

 bash-3.2$ a='aaa' bash-3.2$ echo "${a/./ }" a aa bash-3.2$ echo "${a//./ }" aaa 

使用Internal Field Separator (IFS)变量:

 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 

这可以很好地融入一个函数:

 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 } 

并按原样运行:

 bash-4.3$ split_dot "foo.baz.bar" foo baz bar 

有人错过了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 

也可以使用xargs 。 这是使用xargs

 $ echo "foo.foo.foo" | xargs -d . foo foo foo