【问题标题】:Reformat how a number is displayed in a line of text file with sed使用 sed 重新格式化数字在一行文本文件中的显示方式
【发布时间】:2013-08-19 22:44:54
【问题描述】:

我有一个包含多行的文本文件,我希望替换格式如下的行:

cat: -0600, dog: +0900
cat: -1000, snake: -0500
cat: -0900
cat: +0100

cat: -6, dog: +0900
cat: -10, snake: -0500
cat: -9
cat: +1

还有其他几行是:

dog: -0700
dog: +1000

那不应该被碰。我搜了,不太清楚。除非有更好的方法,否则更喜欢使用 sed。

【问题讨论】:

    标签: macos bash unix terminal


    【解决方案1】:

    鉴于您的复合数据文件,此脚本提供以下示例输出:

    sed 's/^\(cat: [-+]\)0\{0,1\}\([1-9]\{0,1\}[0-9]\)00/\1\2/' data
    

    它查找cat:,后跟+-,然后是可选的0(未捕获),然后是可选的[1-9],后跟[0-9],后跟两个0,并用两个记住的部分替换它。它将+0000 转换为+0。如果最后两位数字并非总是00,请修改第一个正则表达式以匹配[0-5][0-9][0-9][0-9]

    样本输出:

    cat: -6, dog: +0900
    cat: -10, snake: -0500
    cat: -9
    cat: +1
    dog: -0700
    dog: +1000
    

    【讨论】:

      【解决方案2】:

      两个表达式应该可以做到这一点:

      sed 's|^cat: -0600|cat: -6|; s|^dog: -0700|dog: -7|;' file

      【讨论】:

      • 狗线不应触碰。
      【解决方案3】:

      我会用 awk 来做,不知道你是否认为这是一种更好的方式:

      awk '/^cat: /{$2/=100}7' file
      

      使用您的输入进行测试:

      kent$  echo "cat: -0600
      cat: -1000
      cat: -0900
      cat: +0100
      dog: -0700
      dog: +1000"|awk '/^cat: /{$2/=100}7'
      cat: -6
      cat: -10
      cat: -9
      cat: 1
      dog: -0700
      dog: +1000
      

      如果你真的想在正数前加上“+”:

      awk '/^cat: /{$2/=100;$2=$2>0?"+"$2:$2}7' file
      

      相同的输入:

      kent$  echo "cat: -0600
      cat: -1000
      cat: -0900
      cat: +0100
      dog: -0700
      dog: +1000"|awk '/^cat: /{$2/=100;$2=$2>0?"+"$2:$2}7'
      cat: -6
      cat: -10
      cat: -9
      cat: +1
      dog: -0700
      dog: +1000
      

      【讨论】:

      • 它很接近,但似乎如果 cat: -0700 与其他任何东西在同一行,那么它不起作用。如果 cat: -0700 本身就在它自己的行上。
      • 请注意,此答案是在示例数据更改为在前两行的 cat 条目之后包含 dogsnake 之前编写的。这不应该反对它。
      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 2018-03-28
      • 2016-01-15
      • 2023-03-19
      • 2014-10-01
      • 1970-01-01
      • 2021-10-31
      • 2012-01-11
      相关资源
      最近更新 更多