0

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

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

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

    garbage 10.34420
    name1 34.23000
    name 8.32345
    moregarbage 4.23324

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

4

2 回答 2

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
于 2012-04-11T19:19:59.030 回答
0

这可能对您有用:

name=1.23456 
sed ':a;$!{N;ba};s/\<name\> [^\n]*/name '"$name"'/;t;s/\(\([^\n]\+\)\<name1\> [^\n]*\)/\1\n\2name '"$name"'/' file
于 2012-04-11T20:44:28.280 回答