Answers:
您可以使用tr命令转换字符。
% echo "foo.foo.foo" | tr '.' ' '
foo foo foo
tr
实际上就是为了这个目的。sed
太过分了。
tr
,这是一个非常有用的工具,很多人出于某种原因似乎并不了解。比sed
转换整个字符类更简单。
使用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
IFS
不仅仅是将其保存到变量并还原值之外,还比较棘手。未设置IFS
和空IFS
具有不同的行为,所以你需要检查它是否是未设置或只是空的,如果它是以前空。
local
关键字。
IFS
由于某种原因未设置,则此功能会将其设置为空,这的确具有不同的行为。
(IFS=.; echo ...)
。由于此答案使用了函数,Serg可以将花括号更改为括号,而完全不必担心会重置IFS
任何人都错过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'