您可以sed
使用几个循环以经典表示法执行此操作,一个用于修复第一个字段中的点,一个用于修复第二个字段中的点。
sed -e ':f1' -e 's/^\([^ .]*\)\./\1\//' -e 't f1' \
-e ':f2' -e 's/^\([^ ][^ ]*\) \([^ .]*\)\./\1 \2\//' -e 't f2'
锚对于^
正常工作至关重要。是的,您可以在一个参数中将所有内容写在一行上sed
;当脚本如此复杂时,我更喜欢单独参数的清晰性。一个典型的sed
脚本足够高深莫测,不会增加任何额外的理解障碍。
sed ':f1;s/^\([^ .]*\)\./\1\//;t f1;:f2;s/^\([^ ][^ ]*\) \([^ .]*\)\./\1 \2\//;t f2'
对于您的输入样本(两行),输出为:
SomeText/any_text/ch SomeText2/any_3/ch 5.6e-5
SomeText/any_text/ch something/else/point/separated/ch4 5.4e5
如果您使用的是 GNU sed
,则可能需要添加--posix
选项,尽管它似乎表现正确(因此它可能认识到我没有使用任何非 POSIX 表示法,因此坚持使用 POSIX)。
sed
在带有 BSD和 GNU的 Mac OS X 10.7.5 上测试sed
。