用sed指向斜杠

时间:2012-10-17 06:25:52

标签: regex sed

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

...
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 个答案:

答案 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
  • 后附加换行符,然后是HS
  • 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