1 (30.08.2013 13:22:38 отредактировано vovanvster)

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

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

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

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

2 (30.08.2013 13:46:30 отредактировано Vascom)

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

cat $file | cut -f1 -d:

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

3 (30.08.2013 14:35:26 отредактировано vovanvster)

Vascom пишет:

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

cat $file | cut -f1 -d:

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

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

4

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

5

Vascom пишет:

cat $file | cut -f1 -d:

cat здесь тоже не нужен ab

Да, у меня Ubuntu.
Нет, не глючит.

6

vovanvster пишет:
Vascom пишет:

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

cat $file | cut -f1 -d:

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

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

Можно я дальше буду писать без лирики ? Спасибо.

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

7

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

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

8

vovanvster пишет:

Смысл цикла в том чтобы исполнить надлежащие команды используя данные взятые последовательно из всех строк входного файла.

Тогда

while read i; do
      something;
done < file

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

9 (30.08.2013 14:46:04 отредактировано vovanvster)

-=Serj=- пишет:
Vascom пишет:

cat $file | cut -f1 -d:

cat здесь тоже не нужен ab

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

10

yars пишет:
vovanvster пишет:

Смысл цикла в том чтобы исполнить надлежащие команды используя данные взятые последовательно из всех строк входного файла.

Тогда

while read i; do
      something;
done < file

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

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

11

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

12

vovanvster пишет:

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

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

cut -f1 -d: file

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

13

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

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

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

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

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

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

14

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

15

yars пишет:

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

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

16 (30.08.2013 16:30:38 отредактировано vovanvster)

yars пишет:
vovanvster пишет:

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

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

cut -f1 -d: file

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

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

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

17

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

18 (30.08.2013 16:52:35 отредактировано vovanvster)

Vascom пишет:

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

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

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

19

vovanvster пишет:

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

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

20 (30.08.2013 16:58:06 отредактировано Vascom)

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

21 (30.08.2013 17:01:13 отредактировано vovanvster)

.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

22 (30.08.2013 17:11:33 отредактировано vovanvster)

Vascom пишет:
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

Спасибо, сейчас попробую понять
опаньки... а я sed не пользую

Теперь всё откладывается на завтра. Гости пришли и жена шипит. Ща водку буду пить. Завтра к середине дня попробую.
Хэв э найс дей алл, анд найс уикенд.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

23

yars пишет:
vovanvster пишет:

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

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

А мне и не к спеху, так.. Если у Вас будет свободное время от помощи не откажусь.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

24

string_number=`wc -l $file | cut -d ' ' -f1`
подсчитывает число строк в файле.
И используем это число для формирования цикла.

25 (30.08.2013 17:21:16 отредактировано vovanvster)

Vascom пишет:

string_number=`wc -l $file | cut -d ' ' -f1`
подсчитывает число строк в файле.
И используем это число для формирования цикла.

Точно, спасибо огромное, Вы меня сдвинули с мёртвой точки. Но эта жена у меня последняя, не могу с ней спорить. По этому до завтра.
Пытался найти кнопку "сказать пасибо но не нашёл". А как модераторов благодарят ? (это сразу юмор). Но я серьёзно.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

26

Плюсик под аватаркой можно поставить ab

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

27

yars пишет:

Плюсик под аватаркой можно поставить ab

В самом деле, теперь увидел и отправил.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

28 (31.08.2013 02:14:07 отредактировано vovanvster)

for i in $( sed -n '<вот здесь надо переменную вставить> p' $file | cut -f1 -d: ); do
        <всяка разные команды>
done

sed не хочет делать
Можно ли переменную правильно написать ?

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

29

Vascom пишет:

string_number=`wc -l $file | cut -d ' ' -f1`
подсчитывает число строк в файле.
И используем это число для формирования цикла.

Число строк я могу сам задать, чем это поможет ?

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

30

Vascom пишет:
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

Вопрос который я задал с самого начала так и остался всё остальное здесь написанное мне не нужно.
$string_number не могу правильно написать. sed выдаёт ошибку.
Команда в которую надо вставить переменную:

for i in $( sed -n '1 p' $file1 | cut -f1 -d: ); do
echo $i | <commands>

sed считывает первую строку из файла и отправляет на обработку.
Первая строка обозначается '1 p'. Единица и есть переменная. Мне надо запустить цикл со значением от 1 до 50 к примеру.
А ещё лучше от единицы до числа строк в файле. Именно это я не могу сделать.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.