【问题标题】:sed append after match?sed 比赛后追加?
【发布时间】:2011-06-17 06:05:57
【问题描述】:

我有一个这样的文件:(虽然要长得多)

     1  5.60
     2  6.20
     3  6.58
     4  7.32
     5  8.10
     6  7.70

如何使用sed 来制作这样的列表:

     1: 5.60
     2: 6.20
     3: 6.58
     4: 7.32
     5: 8.10
     6: 7.70

谢谢

【问题讨论】:

  • 点击10会发生什么? 100?
  • 糟糕。它基本上没有尾随 0:1、10、99、100,直到 127。

标签: bash sed


【解决方案1】:
sed 's/\(\S\)\s/\1:/' your_file

这也适用于多位数字,只要每行的两个数字之间始终至少有一个空格。

【讨论】:

  • 这似乎不起作用,它的输出与 cat'ing 文件的输出相同。编辑:我发现了问题,该文件使用 TAB 字符(“\t”)。谢谢。但是你能解释一下'\S'吗?和“\(\)”
  • 我编辑了我的答案,以便无论是否使用制表符或空格,它都应该工作。 \S 表示任何不是空格的字符,而我添加到正则表达式中的 \s 与任何空格字符匹配。 \(\) 将括号之间的任何内容放入一个组中,可以在替换中引用\1(因为它是第一个也是唯一的组)。
  • 太棒了,谢谢你的解释=)
【解决方案2】:

为什么不这样使用 awk:

awk 'NF==2{printf("%s: %s\n", $1, $2);}' file.txt

输出

1: 5.60
2: 6.20
3: 6.58
4: 7.32
5: 8.10
6: 7.70

【讨论】:

    【解决方案3】:

    另一种 sed 解决方案是:

    sed -E 's/^([[0-9]+)/\1:/' your_file

    这只是将行开头的任何数字字符串替换为这些数字后跟冒号。

    【讨论】:

      【解决方案4】:

      这个对我有用——基本上 \1 匹配第一个数字,\2 匹配其余数字。

      sed 's/\( *[0-9]*\)\(.*\)/\1:\2/' file.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 2013-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多