Коллеги, пишу мега-супер-пупер скрипт, для практической цели.
Но тут столкнулся с элементарным - не знаю какой командой можно вызвать строку номер 3 (или любой другой номер, задаваемый в параметрах) из текстового файла ?
Читал,
man grep
man sed
но ничего не понял, или это как-то элементарно вызывается, что не расписано, или опять возникают большие сомнения в сосбтвенных интеллектуальных способностях...
Можно конечно
cat -n spisok.txt|grep 3 | а потом sed -ом отрезать строку до первого пробела...
Но может можно как-то проще ?
Проффессор конечно лапухЯ конечно, тот ещё "Йа креветко"Но аппаратура при нём, при нёмНо поиском пользоваться пока умею, оказывается элементарно ВАТСОН -cat spisok.txt |sed '3!d'
(3 -ка тут, номер строки)
Спасибо скажем вот этим ребятам:
opennet: Полезные одно-строчные скрипты sed (sed shell)
Изначально было взято от сюда: ant0.ru: Одно-строчные скрипты SED
Всем спасибо.
Сам спросил, сам ответил, вот все бы так. :D
Я через awk такое делал, в нем есть внтренний счетчик строк. Правда сходу не скажу конкретно, не помню.
cat file | awk '{if (NR == 3) print;}'
Эх, синтаксис этого вашего awk) ...
Я делаю так:
head -3 file | tail -1
Кроме прочего (простоты), работает быстрее варианта выше (заметно на больших файлах).Оригинальный способ)))
Я так понимаю, что приведённые выше однострочные скрипты применимы к целому ряду файлов? т.е. можно выполнить команду, находясь в какой-либо папке и произойдёт замена во всех файлах, в которых найдена строка(слово)?
Поиск и замена "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/' (замена только последнего совпадения)
а если это нет так, то есть ли средства, позволяющие искать и заменять строку во всех файлах какой-либо папки?
for f in `ls`; do cat $f | блаблабла; done
однострочник )
Нельзя ли поподробнее рассказать? Где тут заменяемая строка и где та, на которую будет произведена замена?
Команда выглядит как-то так:
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.Огромное спасибо! Пригодится!
Отправить комментарий