URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7665
[ Назад ]

Исходное сообщение
"Вопрос по sed"

Отправлено Аноним , 23-Окт-08 16:24 
Как с помощью sed заменить первую строку, совпадающую с паттерном, последней, совпадающей с паттерном? И наоборот.

Т.е., есть например, файл:

...
some_var="foo"
...
some_var="bar"
...

Паттерн для строки /^some_var=/. Нужно, понятно, заменить в первом случае foo на bar, во втором - наоборот.


Содержание

Сообщения в этом обсуждении
"Вопрос по sed"
Отправлено phpcoder , 24-Окт-08 09:55 
[...]
>Паттерн для строки /^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"


"Вопрос по sed"
Отправлено Аноним , 24-Окт-08 14:20 
>>Паттерн для строки /^some_var=/. Нужно, понятно, заменить в первом случае foo на
>>bar, во втором - наоборот.

В смысле, нужно не поменять местами, а заменить либо последний матч на первый, либо наоборот.

>Я бы, скорее на awk сделал, потому что на sed, может и
>можно, но как-то сходу не придумывается.

Мне нужно именно на sed, для ${REINPLACE_CMD} во FreeBSD'шном порте. Патч не подходит, работать нужно с динамически сгенеренным файлом. Если гуру sed ничего не подскажут, я лучше несколькими командами сделаю, это хотя бы можно будет прочитать.


"Вопрос по sed"
Отправлено Slim , 24-Окт-08 19:10 
Не знаю, что такое REINPLACE_CMD, но имхо sed тут не в тему. Заменить первым матчем все последующие можно, используя hold buffer - синтаксиса уже не помню, тут есть хорошая дока: http://www.grymoire.com/Unix/Sed.html. Но выделить последний матч и заменить только его, а тем более заменить им все предедущие, ИМХО нельзя. Все-таки _stream_ editor.

"Препод сказал на sed-е, значит на сед-е"
Отправлено Andrey Mitrofanov , 24-Окт-08 11:09 
>Как с помощью sed заменить первую строку, совпадающую с паттерном, последней, совпадающей
>с паттерном? И наоборот.

Преподы просто озверели!! %-)) Поди без шела и textutils?!

>Паттерн для строки /^some_var=/.


"Препод сказал на sed-е, значит на сед-е"
Отправлено Аноним , 24-Окт-08 14:22 
>>Как с помощью sed заменить первую строку, совпадающую с паттерном, последней, совпадающей
>>с паттерном? И наоборот.
>Преподы просто озверели!! %-)) Поди без шела и textutils?!

Да вообще ужас. Иди вон в тему "Как связать v-480 и storedge 3320 (Аппаратура, Железо/Solaris)" в "виртуальной конференции" и там еще про преподов спроси...


"Вопрос по sed"
Отправлено Keeper , 26-Окт-08 12:47 
Только если использовать grep для вычисления номеров нужных строк, и shell, для последующей подстановки вычисленных номеров строк в команды sed.