查找字符串&替换之后的十进制值

时间:2012-04-11 17:36:14

标签: regex sed awk grep

我试图找到一种使用sed或awk的方法,它会找到一个已知的字符串,让我们说一个已知文件名中的“name”,让我们说“filename.txt”。在每次出现字符串后,“name”有一个空格,然后有一个十进制值,范围从0.00001 - 999.99999,在deicmal之前和之后都有很多数字。在大多数情况下,值的类型为X.XXXXX。该值始终位于字符串“name”之后。我希望能够用“我给它”的值替换“name”之后的十进制值,让我们说“mydecimalvalue”。

类似地,如果“filename.txt”中不存在“name”,我想在字符串“name1”之后添加它,这是已知的并且将存在于每个“filename.txt”中。有任何想法吗?一个解释也会非常受欢迎,因为我很容易迷失在正则表达式和选项含义中。

例如,filename.txt可能如下所示:

    garbage 10.34420
    name1 34.23000
    name 8.32345
    moregarbage 4.23324

我想将“name 8.32345”替换为“name 15.43200”。如果文件中的任何地方都不存在“name”后跟任何类型的值,我想在“name1 34.23000”之后写“name 15.43200”。如果文件中存在“name”,则可以假设它只在整个文件中存在一次。 谢谢!

2 个答案:

答案 0 :(得分:1)

if grep -q '\<name\>' filename.txt; then
  sed -i 's/\<\(name\) [0-9.]+/\1 15.43200/' filename.txt
else
  sed -i '/\<name1\>/a\
name 1543200' filename.txt
fi

答案 1 :(得分:0)

这可能对您有用:

name=1.23456 
sed ':a;$!{N;ba};s/\<name\> [^\n]*/name '"$name"'/;t;s/\(\([^\n]\+\)\<name1\> [^\n]*\)/\1\n\2name '"$name"'/' file
相关问题