【问题标题】:replace exact number in shell替换shell中的确切数字
【发布时间】:2016-10-18 07:06:54
【问题描述】:

我有以下矩阵:

 0.380451   0.381955    0   0.237594
 0.317293   0.362406    0   0.320301
 0.261654   0.38797 0   0.350376
 0  0   0   1
 0  1   0   0
 0  0   0   1
 0  0.001504    0   0.998496
 0.270677   0.35188 0.018045    0.359398
 0.36391    0.305263    0   0.330827
 0.359398   0.291729    0.037594    0.311278
 0.359398   0.276692    0.061654    0.302256

而且我只想替换零而不是零后跟点到 0.001,我该如何使用 sed 或 gsub 来做到这一点?

【问题讨论】:

  • edit 您的问题包括给定输入的预期输出以及您迄今为止尝试的内容,即minimal reproducible example
  • 请说明您打算用什么替换零

标签: shell replace sed gsub


【解决方案1】:

这并不优雅,也不是超级便携,但它适用于您的具体示例:

sed -e 's=^0 =X =g
        s= 0$= X=g 
        s= 0 = X =g' data.txt

首先,它假定输入文件中的字段由一个或多个空格分隔。第一部分在行首查找“0”,第二部分在行尾查找,第三部分查找两边有空格的“0”。

为此只使用 sed 有什么特别的原因吗?我确信一个简单的awk 脚本可以做得更好,也更健壮。

【讨论】:

    【解决方案2】:

    匹配替换中的空格。

    echo 0  0.001504    0   0.998496  | sed 's/0[\t ]/Z /g'
    

    【讨论】:

    • 唯一的问题是它与最后一列的空白不匹配..
    • 你可以匹配行尾或换行符。
    • 这不会也替换 110 中的 0 吗?
    • 这有很多问题,包括它会失败和不可移植的各种情况。我很惊讶 OP 接受了它,因为它甚至不会从发布的示例输入中产生 [大概!] 预期的输出。
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2017-03-13
    • 2015-06-06
    • 1970-01-01
    • 2016-05-10
    • 2023-03-21
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多