2014-01-31 2 views
1

Вот что мой файл выглядитзаменить последнее вхождение строки в файле

Gottagohome saab 90 75n > homelog 2>&1& 
Gottagohome saab 90 75n > homelog 2>&1& 
Gottagohome saab 90 75n > homelog 2>&1& 

Эти команды генерируются динамически. То, что я хочу, чтобы искать последнюю команду и заставить ее работать на переднем плане, как этот

Gottagohome saab 90 75n > homelog 2>&1& 
Gottagohome saab 90 75n > homelog 2>&1& 
Gottagohome saab 90 75n > homelog 2>&1 

& следует Сбитые последнюю команду. Любая идея, как это делается. На самом деле мне очень нужно подождать, как и до последнего появления команды gottogohome. Может ли кто-нибудь это сделать тоже. TY Сэм

+1

Это действительно то, что вы хотите сделать? Потому что это не заставит ваш скрипт ждать завершения всех процессов. Возможно, вы на самом деле хотите оставить последний в фоновом режиме, но добавьте «ожидание» в качестве самой последней строки, чтобы дождаться завершения всех процессов ... –

ответ

6

Вы можете использовать tac с awk:

tac file | awk '!done && /Gottagohome saab 90 75n/{done=1; sub(/&$/, "")}1' | tac 
+1

Я очень хочу узнать, почему такой гуру, как ваш хороший «я», напишет это. Почему бы вам не написать «tac-файл | awk» NR == 1 {sub ...} '| tac "? Действительно заинтригованный, а не критический :-) –

+2

Если бы мне пришлось использовать 'NR == 1', я мог бы просто использовать' tail -1 file | sed или awk' Я написал это с гибкостью, что 'комментарий, который нужно заменить 'может или не может присутствовать в последней строке. В входном файле могут быть некоторые пустые строки/прокомментированные строки/некоторая другая команда. Моя команда заменила ** последнее вхождение ** данной команды. Надеюсь, вы сейчас понимаете мою точку зрения. – anubhava

+2

О, хорошо, очень задумываясь о вас! Я предполагаю, что я предполагал, что пример, который был опубликован OP, был полным и полным и что последняя строка была последней командой, но это могло быть не самое лучшее предположение. Спасибо за объяснение. –

6

Это может работать для вас (GNU СЭД):

sed '$s/.$//' file 

EDIT:

Для удовлетворения последней команды:

sed -r '/(Gottagohome saab 90 75n.*)&\s*$/M,$!b;//{x;//p;x;h};//!H;$!d;x;s//\1/' file 
+0

может быть немного обеспечена с sed -posix '$ s/\ $ [ [: blank:]] * $ // 'YourFile – NeronLeVelu

1

Чтобы просто удалить последнюю & с awk

awk '{a[NR]=$0} END {for (i=1;i<NR;i++) print;NF-=1;print}' OFS="" FS="" file 
Gottagohome saab 90 75n > homelog 2>&1& 
Gottagohome saab 90 75n > homelog 2>&1& 
Gottagohome saab 90 75n > homelog 2>&1 

Другой вариант

awk 'NR>1 {print f}{f=$0} END {print substr($0,1,length($0)-1)}' file 
1
awk 'NR==FNR{if(/^Gotta/) a=NR;next} {if (FNR==a) sub(/&$/,"")}1' file file 
3
$ awk -v RS= '{sub(/&$/,"")}1' file 
Gottagohome saab 90 75n > homelog 2>&1& 
Gottagohome saab 90 75n > homelog 2>&1& 
Gottagohome saab 90 75n > homelog 2>&1 
Смежные вопросы