使用SED/AWK替换字符串

问题描述:

我想替换文件中字符串的一部分,即将NFIN=4替换为W=4N。 请注意,在NFIN=4的数字部分中,数字可以是任何整数或浮点值;如果输入为NFIN=3.0,则输出应为W=3.0。 没有负数,它是3或3.0。 例如,输入线:使用SED/AWK替换字符串

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 
+0

如果你不这并不意味着具有负指数的负数是有意的,然后适当更新问题。 –

+0

sed -E -inplace's/\ bNFIN =([[:digit:]] +)\ b/W = \ 1N /'PREICG_X1M_AH360TL_C8_ARCH_3_4.lpeSpc – metalboy

+0

这很重要,因为它使得数匹配的正则表达式更加复杂,但基础是一样的。 NFIN条目是否曾经出现过(不太可能)或行尾?如果它总是在一条线的中间,那也会让生活变得更容易。如果数字总是有效的(例如,永远不会有像'NFIN = Aleph-Null'那样不应该被改变的条目),那么它在'NFIN ='之后的数字的事实在很大程度上变得不重要。使用正则表达式是一种美术;你希望有足够的灵活性去做你想做的事,而不要做太多或太少。了解你的数据! –

您可以使用此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 
+0

@metalboy:现在工作了吗? – anubhava

sed -E 's/NFIN=([0-9]+(\.[0-9]+)?)/W=\1N/' file 
+1

虽然这段代码可能有助于解决问题,但它并没有解释_why_和/或_how_它是如何回答问题的。不好的问题不应该只给出可怜的答案;这有助于任何人。 –