我有像这种格式的文本文件:
...
SomeText.any_text/ch SomeText2.any_3/ch 5.6e-5
SomeText.any_text/ch something.else.point.separated/ch4 5.4e5
...
第一行中的有三个元素:两个 - 字母数字 - 下划线 - 斜线字符串和一个 - 浮点数。
我只需要在字符串处将点替换为斜杠。
我尝试使用带有正则表达式的sed
sed 's/\([\w_]\+\)\(\.\)/\1\//g'
并没有积极的结果。
答案 0 :(得分:1)
您的元素看起来像字段。因此,我首选的方法是使用awk
:
awk '{ for (i=1; i<=2; i++) gsub(/\./, "/", $i) }1' file.txt
结果:
SomeText/any_text/ch SomeText2/any_3/ch 5.6e-5
SomeText/any_text/ch something/else/point/separated/ch4 5.4e5
答案 1 :(得分:1)
这可能适合你(GNU sed):
sed 's/[^ ]*$/\n&/;h;y/./\//;G;s/\n.*\n//' file
说明:
s/[^ ]*$/\n&/
在最后一个字段h
将模式空间(PS)复制到保留空间(HS)y/./\//
将所有.
翻译成PS中的/
G
在PS s/\n.*\n//
删除第一个和最后一个换行符之间的所有内容,即删除旧字符串这个成语可以用来简化一行的改变,而不需要诉诸复杂的正则表达式
答案 2 :(得分:0)
你可以用经典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)。
使用BSD sed
和GNU sed
在Mac OS X 10.7.5上测试。
答案 3 :(得分:0)
awk '{gsub(/\./,"",$1);;gsub(/\./,"",$2);print}' your_file