【问题标题】:Points to slashes with sed用 sed 指向斜线
【发布时间】:2012-10-07 08:37:34
【问题描述】:

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

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

而且没有积极的结果。

【问题讨论】:

  • 你在使用\(\)\1..
  • @Anirudha:(a) 请不要在 SO 上使用 SMS-ese。 (b) POSIX sed(意为可移植的sed)使用\(...\); GNU sed 是非标准的,除非您使用 --posix 要求它,否则不会使用该表示法,但是......好吧,让我们说拥有标准的重点(重点之一)是让它变得容易移动软件,而 GNU sed 的非标准使每个人都更难。 (OTOH,POSIX sed 无法将 \w 识别为元字符序列。)
  • @JonathanLeffler sed 让它变得如此困难

标签: regex sed


【解决方案1】:

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

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

解释:

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

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

【讨论】:

    【解决方案2】:
    awk '{gsub(/\./,"",$1);;gsub(/\./,"",$2);print}' your_file
    

    【讨论】:

      【解决方案3】:

      您可以使用经典的 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 上测试。

      【讨论】:

        【解决方案4】:

        您的元素看起来像字段。因此,我的首选方法是使用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
        

        【讨论】:

          猜你喜欢
          • 2020-12-09
          • 2014-09-16
          • 1970-01-01
          • 2013-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-27
          相关资源
          最近更新 更多