답변:
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'