如何替换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'