Как с помощью sed заменить первую строку, совпадающую с паттерном, последней, совпадающей с паттерном? И наоборот.Т.е., есть например, файл:
...
some_var="foo"
...
some_var="bar"
...Паттерн для строки /^some_var=/. Нужно, понятно, заменить в первом случае foo на bar, во втором - наоборот.
[...]
>Паттерн для строки /^some_var=/. Нужно, понятно, заменить в первом случае foo на
>bar, во втором - наоборот.Я бы, скорее на awk сделал, потому что на sed, может и можно, но как-то сходу не придумывается. А на awk, вот:
[c0der@rock ~]$ cat test.txt
some_var="foo"
some_var="test"
some_var="bar"
[c0der@rock ~]$ awk 'BEGIN{first=0;last=0}{arr[NR]=$0;if(/^some_var=/){if(first==0){first=NR};last=NR}}END{for(i=1; i<=length(arr);i++){if(first==i&&first!=last){print arr[last]}else{if(last==i&&first!=last){print arr[first]}else{print arr[i]}}}}' test.txt
some_var="bar"
some_var="test"
some_var="foo"
>>Паттерн для строки /^some_var=/. Нужно, понятно, заменить в первом случае foo на
>>bar, во втором - наоборот.В смысле, нужно не поменять местами, а заменить либо последний матч на первый, либо наоборот.
>Я бы, скорее на awk сделал, потому что на sed, может и
>можно, но как-то сходу не придумывается.Мне нужно именно на sed, для ${REINPLACE_CMD} во FreeBSD'шном порте. Патч не подходит, работать нужно с динамически сгенеренным файлом. Если гуру sed ничего не подскажут, я лучше несколькими командами сделаю, это хотя бы можно будет прочитать.
Не знаю, что такое REINPLACE_CMD, но имхо sed тут не в тему. Заменить первым матчем все последующие можно, используя hold buffer - синтаксиса уже не помню, тут есть хорошая дока: http://www.grymoire.com/Unix/Sed.html. Но выделить последний матч и заменить только его, а тем более заменить им все предедущие, ИМХО нельзя. Все-таки _stream_ editor.
>Как с помощью sed заменить первую строку, совпадающую с паттерном, последней, совпадающей
>с паттерном? И наоборот.Преподы просто озверели!! %-)) Поди без шела и textutils?!
>Паттерн для строки /^some_var=/.
>>Как с помощью sed заменить первую строку, совпадающую с паттерном, последней, совпадающей
>>с паттерном? И наоборот.
>Преподы просто озверели!! %-)) Поди без шела и textutils?!Да вообще ужас. Иди вон в тему "Как связать v-480 и storedge 3320 (Аппаратура, Железо/Solaris)" в "виртуальной конференции" и там еще про преподов спроси...
Только если использовать grep для вычисления номеров нужных строк, и shell, для последующей подстановки вычисленных номеров строк в команды sed.