1

我有这种格式的文本文件:

...
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'

并且没有积极的结果。

4

4 回答 4

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
于 2012-10-17T06:54:57.907 回答
1

这可能对您有用(GNU sed):

sed 's/[^ ]*$/\n&/;h;y/./\//;G;s/\n.*\n//' file

解释:

  • s/[^ ]*$/\n&/在最后一个字段之前插入换行符
  • h将模式空间 (PS) 复制到保持空间 (HS)
  • y/./\//将PS 中的all .'s 翻译成's/
  • G将换行符然后 HS 添加到 PS
  • s/\n.*\n//删除第一个和最后一个换行符之间的所有内容,即删除旧字符串

这个成语可以用来简化行的一部分,而不需要求助于复杂的正则表达式

于 2012-10-17T07:32:06.810 回答
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)。

sed在带有 BSD和 GNU的 Mac OS X 10.7.5 上测试sed

于 2012-10-17T07:02:39.387 回答
0
awk '{gsub(/\./,"",$1);;gsub(/\./,"",$2);print}' your_file
于 2012-10-17T07:08:32.890 回答