2012-04-11 3 views
0

Я пытаюсь найти способ использования sed или awk, который найдет известную строку, скажем «имя» в известном имени файла, скажем, «filename.txt». После каждого появления строки «имя» есть пробел, а затем есть десятичное значение, которое может варьироваться от 0,00001 до 999,99999, с таким количеством чисел как до, так и после deicmal. В большинстве случаев значение имеет тип X.XXXXX. Это значение всегда появляется после строки «name». Я хочу, чтобы иметь возможность заменить это десятичное значение, которое появляется после «name» со значением, которое я ему даю, позволяет сказать «mydecimalvalue».Найти строку и заменить десятичное значение после нее

Аналогичным образом, если «имя» не существует в «filename.txt», я хотел бы добавить его после строки «name1», которая известна и будет присутствовать в каждом файле «filename.txt». Есть идеи? Объяснение также было бы очень полезно, так как я могу легко потеряться в регулярных выражениях и значениях параметров.

Например, filename.txt может выглядеть следующим образом:

garbage 10.34420 
    name1 34.23000 
    name 8.32345 
    moregarbage 4.23324 

Я хочу, чтобы заменить "имя 8.32345" с "именем 15.43200", например. Если «имя», за которым следует любой тип значения, не существует нигде в файле, я хочу написать «имя 15.43200» сразу после «name1 34.23000». Если в файле существует «имя», можно предположить, что он будет существовать только один раз во всем файле. Спасибо!

+0

пожалуйста, рассмотреть вопрос о замене этого сложного описания с некоторой выборки данных, которая охватывает случаи, необходимые для поддержки и требуемая мощность для этих данных. Обратите внимание, что вы можете использовать инструмент {} на панели форматирования, чтобы отступать от кода и данных. Удачи. – shellter

ответ

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