LinuxForum.Fans
Тема

Переменные в sed

Автор: vovanvster 41 сообщений 11542 просмотров
#335267

Здравствуйте всем.
Я часто пользуюсь одним скриптом для редактирования другого.
При редактировании используются команды sed. А у меня с sed'-ом совершенно нет понимания.
Как не пытаюсь воткнуться в синтаксис не получается. Объяснить своими словами не кому.

Имеется строка вида:

text

# берём данные из первой строки
sed -n '1 p' $file | cut -f1 -d:

Ну и так далее...
Хочется запускать скрипт в цикле, а для этого нужно номер строки из которой sed берёт данные объявить в виде переменной.
У меня не получается. При этом переменная очень проста: прямая последовательность строк в файле пока не закончатся строки:
"1 2 3 ... кончилось".
Помогите пожалуйста, если можно то без готового суперкрутого скрипта. Это просто пример, понять надо. Надоело писать длинные и неуклюжие. Хочу библиотеку функций сделать. И вообще хочу чтоб было круто. \m/
P.S. Если не получится круто то хотя бы "кошерно".
Заранее спасибо.

#335268

Для этого sed вообще не нужен. Незачем построчно перебирать, если cut весь файл сразу может обработать.
Просто сделай так:

text
cat $file | cut -f1 -d:

А если просто на понимание, то прочитай это http://www.bash-scripting.ru/abs/chunks/index.html
И делай цикл на bash.

#335271
Vascom написал:
Для этого sed вообще не нужен. Незачем построчно перебирать, если cut весь файл сразу может обработать.
Просто сделай так:
text
cat $file | cut -f1 -d:

А если просто на понимание, то прочитай это http://www.bash-scripting.ru/abs/chunks/index.html
И делай цикл на bash.

Точно, большое спасибо. Дело в том что я многие строки беру из своих же старых скриптов. Там документация ни какая.
И я не трачу время на поиск всех прошлых глупостей когда хочу увидеть результат.
НО! Объясните мне пожалуйста как я могу использовать Вашу мудрость в достижении своей цели ?
# щас подумаю и допишу
ах какие вы нетерпеливые, молоденькие наверное ?

#335274

Ну давай, подумай. Опиши свою цель.

#335275
"Vascom" написал:
cat $file | cut -f1 -d:

cat здесь тоже не нужен :)

#335277
vovanvster написал:
[quote=Vascom]Для этого sed вообще не нужен. Незачем построчно перебирать, если cut весь файл сразу может обработать.
Просто сделай так:
text
cat $file | cut -f1 -d:

А если просто на понимание, то прочитай это http://www.bash-scripting.ru/abs/chunks/index.html
И делай цикл на bash.

Точно, большое спасибо. Дело в том что я многие строки беру из своих же старых скриптов. Там документация ни какая.
И я не трачу время на поиск всех прошлых глупостей когда хочу увидеть результат.
НО! Объясните мне пожалуйста как я могу использовать Вашу мудрость в достижении своей цели ?
# щас подумаю и допишу[/quote]
Можно я дальше буду писать без лирики ? Спасибо.

1) В "$file" много строк.
2) Как посредством cat считать данные только из строки номер которой определён в переменной ?
3) Переменная последовательна от "1" до "больше нет"

#335278

Сейчас попытаюсь определить смысл всей функции ( лично для меня решение не очевидно и я пробовал различные способы ).

Существует файл - список, состоящий из строк вида "имя:параметр"
Скрипт должен изъять из первой строки слово и заменить им старое слово в другом файле.
Дальше следуют команды которые надо исполнить.
Смысл цикла в том чтобы исполнить надлежащие команды используя данные взятые последовательно из всех строк входного файла. Это примерно. Я стараюсь одно большое действие раскладывать на маленькие.

#335279

vovanvster написал:

Смысл цикла в том чтобы исполнить надлежащие команды используя данные взятые последовательно из всех строк входного файла.
Тогда
text
while read i; do
      something;
done < file

Или я вас не понял?

#335280
-=Serj=- написал:
[quote="Vascom"]cat $file | cut -f1 -d:

cat здесь тоже не нужен :)[/quote]
Ты против "cut"? Или отрицание относится к месту действия ? Или ты можешь сказать по заданному вопросу что-нибудь умное но стесняешься ? Или просто настроение плохое и гавкнуть хочется ?
P.S. Выпей водки

#335281

yars написал:
[quote=vovanvster]
Смысл цикла в том чтобы исполнить надлежащие команды используя данные взятые последовательно из всех строк входного файла.
Тогда
text
while read i; do
      something;
done < file

Или я вас не понял?[/quote]
Истинно так. Только немножко сложное надо сделать. Сейчас я сформулирую и напишу.

#335283

Я как то while не использую но логику вроде понимаю. И в данном случае я думаю что не стоит обращать внимание на то if или while. Дело совсем в другом. Я не знаю как это сделать без sed и не знаю как передать sed переменную.
Сейчас покурю, соображу. И напишу. Я тормоз.

#335284
vovanvster написал:
Ты против "cut"? Или отрицание относится к месту действия ? Или ты можешь сказать по заданному вопросу что-нибудь умное но стесняешься ? Или просто настроение плохое и гавкнуть хочется ?
P.S. Выпей водки

Но он там действительно не нужен. Это эквивалентно

text
cut -f1 -d: file

Разница только в том, что в первом случае cut работает с потоком (pipe), а во втором - с файлом напрямую. Ну да это к делу не относится и многим присутствующим известно.

#335287

Часть кода в вольном изложении:
1) Считываю 1-ю строку из файла-списка.
2) Выделяю из строки всё что находится до определённого символа (символ определяю сам и думаю что это не важно)
3) Помещаю полученное значение в определённое место в другом файле. (Опять используя sed)
4) Исполняю команды
5) Уже "хорошо"

И это работает.

Но я указываю номер строки "1" врукапашную.
А хочу чтобы скрипт делал всё что надо сначала используя 1-ю строку, потом вторую и т.д.

В связи со всем выше изложенным:
как вставить переменную в строку команд sed ?

text
for i in $( sed -n '1 p' $snt_f | cut -f2 -d: ); do

вместо цифирки один надо переменную. Наверное я не правильно излагаю вопрос, но мысли в беспорядке.

#335290

А подставлять вместо единички "$i" не пробовали?

#335293
yars написал:
А подставлять вместо единички "$i" не пробовали?

Ну типа да, из этого и вырос вопрос. Как sed-у объяснить что это переменная ?
Хотите пару строчек, сами проверите? Не исключаю банальных ошибок со своей стороны.

#335298
yars написал:
[quote=vovanvster]Ты против "cut"? Или отрицание относится к месту действия ? Или ты можешь сказать по заданному вопросу что-нибудь умное но стесняешься ? Или просто настроение плохое и гавкнуть хочется ?
P.S. Выпей водки

Но он там действительно не нужен. Это эквивалентно

text
cut -f1 -d: file

Разница только в том, что в первом случае cut работает с потоком (pipe), а во втором - с файлом напрямую. Ну да это к делу не относится и многим присутствующим известно.[/quote]
Пожалуйста давайте без осложнений. Бритвочку используем. Нужна обработка определённой строки, или строки под определённым номером. А cut скинет всё в кучу.
Можно пойти другим путём, без sed. Обломался очень быстро. Простые решения не представляю как использовать. Жлобским методом работает.
P.S. А по поводу pipe, для меня это трубка. Или есть сокральное значение ? или кастовое ? Обратите внимание на то что вопрос по башу.

Ну типа так: писал писал, и написал. всё. работает. и пайпов не знаю и в институте не учился. и поэтому пох.
пользователей напильника делают тысячами. они бряцают оружием на вечеринках.
А я сейчас поживу и решение само сформулируется. Может почитаю чего.
Спасибо всем за участие.
P.S. А сейчас я послушаю не Бетховена а шнура

#335305

Не следует делать универсальные скрипты ("Нужна обработка определённой строки, или строки под определённым номером"). Такой скрипт будет запутанным, излишне сложным, неочевидным, плохо отлаживаемым, медленным.
Скрипт должен быть оптимальным - то есть решать конкретную задачу минимальными средствами.

#335311
Vascom написал:
Не следует делать универсальные скрипты ("Нужна обработка определённой строки, или строки под определённым номером"). Такой скрипт будет запутанным, излишне сложным, неочевидным, плохо отлаживаемым, медленным.
Скрипт должен быть оптимальным - то есть решать конкретную задачу минимальными средствами.

Ну конечно, полностью согласен. Сейчас передо мной стоит задача запустить' таки короткий скрипт с переменными. И знаю что это не сложно. Надо знать как. даже дело не в том как сделать. Надо делать красиво. Если не смог красиво - делай как можешь. Но оптимальность часто красива. А я как бы эстет.
Ещё раз оговорюсь что работает, но это как трусы с дырками. Дома носишь а к гостям не выйти. :)
Это всё трепотня, а что бы Вы могли посоветовать конкретно ? Не могу же я зайти на форум с куском кода, типа нате отлаживайте ? Что нужно конкретизитовать ? Я вижу что много хороших людей и они готовы разъяснить.

#335313
vovanvster написал:
Хотите пару строчек, сами проверите? Не исключаю банальных ошибок со своей стороны.

Я бы с удовольствием, но сейчас я с телефона. Не могу :(

#335315
text
string_number=`wc -l $file | cut -d ' ' -f1`
for i in `seq 1 $string_number`
do
    sed -n '$i p' $file | cut -f2 -d:
done
Войдите или зарегистрируйтесь, чтобы ответить.