2012-03-29 1 views
0

У меня есть входной файл, например, следующий.как заменить определенную запись на строку, содержащую строку с номером из другого файла, используя inplace editing sed в linux

R sfst  1000.0000                
$ new time step for mass scaled calculation 
R dt2ms -4.000E-7                
$ friction value for blank 
R mue  0.120000                
$ blankholder force 
R bhf  2.0000E+5                
$ simulation time 
R endtime 0.150000 

я хочу, чтобы изменить значение в строке, содержащей «» МУП со следующими я могу читать его, но не могу изменить его.

awk ' /mue/ { print $3 } ' input.txt 

Значение должно быть взято из другого файла fric.txt. fric.txt содержит только числа, по одному на каждой строке.

fric.txt имеет данные, как

0.1234 
0.234 
0.0234 

. .

Blockquote

Следует отметить, что только первый экземпляр должен быть заменен, и формат т.е. белый интервал быть cosntant.

Blockquote

Кто-нибудь может вести меня делать это, используя AWK или патч в?

+0

Какая линия? Известная фиксированная линия, например, линия 42? –

+0

нет, это линия с meu, может быть где угодно –

+0

Нет, какая строка fric.txt? –

ответ

1

Это может работать для вы:

sed '/\<mue\>/!d;=;s/.* \([^ ]\+\).*/\1/;R fric.txt' input.txt | 
sed 'N;N;s|\n|s/|;s|\n|/|;s|$|/|;q' >temp.sed 
sed -i -f temp.sed input.txt 
+0

проблема в том, что она продолжает заменять весь экземпляр meu и не останавливается в первом экземпляре. это проблема. –

+0

, пожалуйста, предложите для изменения только в первом экземпляре. –

+1

OK просто сократите сценарий до первого экземпляра, см. Исправленное решение. – potong

2

Попробуйте эту команду:

$ awk '/mue/ && !seen {getline $3 <"fric.txt"; seen=1} 1' input.txt 
+0

В этом случае мне нужно передать файл и вернуть его обратно в мой файл ввода. это также возможно с sed -i, так что на месте редактирования происходит, и мне не нужно переименовывать файл? он работает, но это будет изящно. –

+0

Побочный эффект: вы можете «разбить» их перед переименованием. – kev

+0

меняет интервал между двумя, я хочу сохранить формат, чтобы программное обеспечение продолжало распознавать формат. не могли бы вы рассказать мне, как это сделать? –

1

Вы можете сделать это с СЭД в СЭД (предполагая, что вы хотите взять линию 1 из fric.txt):

sed -ir 's/(.*mue[ \t]+)[0-9.]+(.*)/\1'$(sed -n '1{p;q}' fric.txt)'\2/' input.txt 
+0

в результате получается ошибка sed: -e выражение # 1, char 39: неверная ссылка \ 2 на 's 'команда RHS –

+0

Я не получаю такую ​​ошибку. Вы скопировали и ввели команду? –

+0

Да, прямо в консоли, а также в скрипте. его та же ошибка. –