【问题标题】:String replace using SED/AWK使用 SED/AWK 替换字符串
【发布时间】:2017-02-08 03:45:27
【问题描述】:

我想替换文件中的部分字符串,即将NFIN=4替换为W=4N。 请注意NFIN=4的数字部分,数字可以是任何int或float值;如果输入为NFIN=3.0,则输出应为W=3.0。 没有负数,它不是 3 就是 3.0。 例如输入行:

XMPparasitic2 VDD:F86 VDD:F87 VDD:F88 VNW pch_lvt_mac L=8N NFIN=4 ODIND=5

应该成为输出:

XMPparasitic2 VDD:F86 VDD:F87 VDD:F88 VNW pch_lvt_mac L=8N W=4N ODIND=5

【问题讨论】:

  • 如果您的意思不是带有负指数的负数,请适当更新问题。
  • sed -E -inplace 's/\bNFIN=([[:digit:]]+)\b/W=\1N/' PREICG_X1M_AH360TL_C8_ARCH_3_4.lpeSpc
  • 这很重要,因为它使数字匹配正则表达式变得更加复杂,但基础是相同的。 NFIN 条目能否出现在行首(不太可能)或行尾?如果它总是在一条线的中间,那也会让生活更轻松。如果数字始终有效(例如,从来没有像NFIN=Aleph-Null 这样的条目不应该更改),那么它是NFIN= 之后的数字这一事实在很大程度上变得无关紧要。玩正则表达式是一门艺术。你想要一些足够灵活的东西来做你想做的事,而不会做太多或太少。了解您的数据!
  • NFIN=NFIN 会发生什么?
  • Nope NFIN=5N 只会出现在任何特定行的第 7 或第 8 位。

标签: bash perl awk sed sh


【解决方案1】:

您可以使用此sed 命令来匹配数值数据:

cat file
XMPparasitic2 VDD:F86 VDD:F87 VDD:F88 VNW pch_lvt_mac L=8N NFIN=4 ODIND=5
XMPparasitic2 VDD:F86 VDD:F87 VDD:F88 VNW pch_lvt_mac L=8N NFIN=FOO ODIND=5
XMPparasitic2 VDD:F86 VDD:F87 VDD:F88 VNW pch_lvt_mac L=8N NFIN=4.0 ODIND=5

sed -E 's/NFIN=([0-9]+\.[0-9]+)/W=\1/g; s/NFIN=([0-9]+)/W=\1N/g' file
XMPparasitic2 VDD:F86 VDD:F87 VDD:F88 VNW pch_lvt_mac L=8N W=4N ODIND=5
XMPparasitic2 VDD:F86 VDD:F87 VDD:F88 VNW pch_lvt_mac L=8N NFIN=FOO ODIND=5
XMPparasitic2 VDD:F86 VDD:F87 VDD:F88 VNW pch_lvt_mac L=8N W=4.0 ODIND=5

【讨论】:

    【解决方案2】:
    sed -E 's/NFIN=([0-9]+(\.[0-9]+)?)/W=\1N/' file
    

    【讨论】:

    • 虽然此代码可能有助于解决问题,但它并没有解释为什么和/或如何回答问题。糟糕的问题不应该只是得到糟糕的答案;这对任何人都没有帮助。
    猜你喜欢
    • 2019-08-07
    • 2015-01-13
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2020-02-18
    • 2012-10-15
    相关资源
    最近更新 更多