如何让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