Какой системной утилитой командной строки вызвать N -ную (любую нужную мне по номеру) строчку конкретного файла ? [Решено]

Изображение пользователя balamutick.

Коллеги, пишу мега-супер-пупер скрипт, для практической цели.

Но тут столкнулся с элементарным - не знаю какой командой можно вызвать строку номер 3 (или любой другой номер, задаваемый в параметрах) из текстового файла ?

Читал,
man grep
man sed

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

0
balamutick - 31 Октябрь, 2009 - 16:29
Изображение пользователя balamutick.

Можно конечно
cat -n spisok.txt|grep 3 | а потом sed -ом отрезать строку до первого пробела...

Но может можно как-то проще ?

+1
balamutick - 31 Октябрь, 2009 - 16:53
Изображение пользователя balamutick.

Проффессор конечно лапух Я конечно, тот ещё "Йа креветко"

Но аппаратура при нём, при нём Но поиском пользоваться пока умею, оказывается элементарно ВАТСОН -
cat spisok.txt |sed '3!d'
(3 -ка тут, номер строки)

Спасибо скажем вот этим ребятам:
opennet: Полезные одно-строчные скрипты sed (sed shell)

Изначально было взято от сюда: ant0.ru: Одно-строчные скрипты SED

Всем спасибо.

0
Жюстина - 31 Октябрь, 2009 - 17:30
Изображение пользователя Жюстина.

Сам спросил, сам ответил, вот все бы так. :D

0
Soi-Fong - 31 Октябрь, 2009 - 18:01
Изображение пользователя Soi-Fong.

Я через awk такое делал, в нем есть внтренний счетчик строк. Правда сходу не скажу конкретно, не помню.

+1
Voyageur - 31 Октябрь, 2009 - 18:22
Изображение пользователя Voyageur.

cat file | awk '{if (NR == 3) print;}'

+1
urusha - 1 Ноябрь, 2009 - 08:59
Изображение пользователя urusha.

Эх, синтаксис этого вашего awk) ...
Я делаю так: head -3 file | tail -1 Кроме прочего (простоты), работает быстрее варианта выше (заметно на больших файлах).

0
Voyageur - 1 Ноябрь, 2009 - 10:00
Изображение пользователя Voyageur.

Оригинальный способ)))

0
awesome - 31 Октябрь, 2009 - 20:09
Изображение пользователя awesome.

Я так понимаю, что приведённые выше однострочные скрипты применимы к целому ряду файлов? т.е. можно выполнить команду, находясь в какой-либо папке и произойдёт замена во всех файлах, в которых найдена строка(слово)?

Поиск и замена "foo" на "bar" в каждой строке:

    * sed 's/foo/bar/' (замена только первого совпадения в строке)
    * sed 's/foo/bar/4' (замена первых 4рех совпадений в строке)
    * sed 's/foo/bar/g' (замена ВСЕХ совпадений в строке)
    * sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' (замена предпоследнего совпадения)
    * sed 's/\(.*\)foo/\1bar/' (замена только последнего совпадения)

а если это нет так, то есть ли средства, позволяющие искать и заменять строку во всех файлах какой-либо папки?

0
Soi-Fong - 31 Октябрь, 2009 - 20:33
Изображение пользователя Soi-Fong.

for f in `ls`; do cat $f | блаблабла; done
однострочник )

0
awesome - 31 Октябрь, 2009 - 21:06
Изображение пользователя awesome.

Нельзя ли поподробнее рассказать? Где тут заменяемая строка и где та, на которую будет произведена замена?

+1
Voyageur - 1 Ноябрь, 2009 - 11:18
Изображение пользователя Voyageur.

Команда выглядит как-то так:
for f in `ls`; do cat $f | sed 's/foo/bar/g'; done
Здесь каждый файл из текущей директории (for f in `ls`) мы распечатываем (cat $f). Эту распечатку мы перенаправляем потоковому редактору sed, который в содержимом этого файла меняет все вхождения foo на bar. Результат выводится в stdout.
Вообще-то, в таких случаях хорошо бы сохранять все изменения в том же файле, но вот такое перенаправление cat $f | sed 's/foo/bar/g' >$fдаст нам пустой файл $f, почему - не знаю...Выход - перенапрвить вывод в новый файл, например, ${f}.new или же использовать аналогичную по принципу опцию sed'a: sed -i.old 's/foo/bar/g' $fВ этом случае отредактированный текст будет храниться в файлах $f, а старые версии - в файлах ${f}.old.

0
awesome - 1 Ноябрь, 2009 - 11:33
Изображение пользователя awesome.

Огромное спасибо! Пригодится!

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры