2012-04-11 66 views
0

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

同样,如果“filename.txt”中不存在“name”,我想将它添加到字符串“name1”后面,这是已知的,并且将在每个“filename.txt”中存在。有任何想法吗?一个解释也将非常赞赏,因为我很容易迷失在正则表达式和选项意义中。

例如,FILENAME.TXT可能看起来像:

garbage 10.34420 
    name1 34.23000 
    name 8.32345 
    moregarbage 4.23324 

我要替换 “名称8.32345” 与 “名15.43200” 为例。如果在文件的任何位置不存在任何类型值的“名称”,我想在“name1 34.23000”后面写上“name 15.43200”。如果文件中存在“名称”,可以假定它只会在整个文件中存在一次。 谢谢!

+0

请考虑与涵盖了你需要的支持和所需的输出该数据的情况下,一些样本数据来替换这个详尽的描述。请注意,您可以使用格式栏中的工具缩进代码和数据。祝你好运。 – shellter 2012-04-11 17:52:49

回答

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 
0

这可能会为你工作:

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