如何替换bashshell中的点?

如何替换bashshell中的点?,bash,shell,string,awk,Bash,Shell,String,Awk,我想这样做: echo "abc edg.txt" | awk -F. '{print $0"---"$1}' 我预计结果应该是: abc edg---txt 但事实证明: abc edg.txt--abc edg 导致这种行为的原因是什么?我如何修复代码以生成预期的输出?在awk中,$0计算整个记录,字段索引基于一个 您可能想做: $ echo "abc edg.txt" | awk -F. '{print $1"---"$2}' abc edg---txt 修复了awk的问题,但由于您询

我想这样做:

echo "abc edg.txt" | awk -F. '{print $0"---"$1}'
我预计结果应该是:

abc edg---txt

但事实证明:

abc edg.txt--abc edg


导致这种行为的原因是什么?我如何修复代码以生成预期的输出?

在awk中,
$0
计算整个记录,字段索引基于一个

您可能想做:

$ echo "abc edg.txt" | awk -F. '{print $1"---"$2}'
abc edg---txt
修复了
awk
的问题,但由于您询问了如何在Bash shell中按点拆分字符串,下面的答案正好可以做到这一点,而无需求助于
awk

$ foo="abc edg.txt" ; IFS=. ; a=($foo) ; echo ${a[0]}---${a[1]}
abc edg---txt
如果只希望在字符串中的最后一个“.”上拆分,则更容易:

$ foo="abc edg.txt" ; echo ${foo%.*}---${foo##*.}
abc edg---txt

如果您只想替换圆点:

var="abc edg.txt"
echo ${var/./---}

Awk
很棒,但还有其他替代方法

使用
sed
可以获得所有点,而不仅仅是第一个点

echo "abc edg.txt" | sed 's/\./~~/g'
输出:
abc edg~~txt

表达式
sed's/\./~~/g'
相当于“用
~
全局替换
\.
(点)”


Out:
abc here~~is~~more~~dot separated text

是的,这是最简单的替换方法。当我回答这个问题时,这个问题肯定是问如何“分开”的!您希望
${foo%.*)
仅去掉最后一个点并进行测试
variable="abc here.is.more.dot-separated text"
echo ${variable}| sed 's/\./~~/g'