[Решено] Переменная в аргументах редактора sed

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

sgfault писал(а):
04.06.2012 16:54
(здесь я вам предлагаю заменить пустое поле на конкретную реализацию)

sgfault писал(а):
04.06.2012 16:54
А потом останется всего лишь убедить оппонентов, что использование вашего "произведения" проще, понятнее, да и работает быстрее, чем `grep -L`.

http://drbatty.ru/sed/ch07.html
Я всё-же проверил: получилось для первого скрипта 18.5 сек., а для второго 6.4 сек. Таким образом второй скрипт работает примерно в 3 раза быстрее. Для сравнения: tail сработала за 2.3 секунды (ага - эта задача явно не для sed, sed вообще ни в коем случае нельзя использовать, когда есть другая утилита, заточенная именно на эту задачу - что-же вы хотели, та-же tail выделяет в самом начале памяти под 10 строк, и просто читает туда данные, нам-же приходится для каждой строки удалять первую - для чего необходимо сдвинуть остальные - т.о. нам нужно не только прочитать N байт(одну строку), переместить N*10 байт! Если-бы файл был в памяти, то sed сработала-бы не в три раза, а в 11 раз медленнее! (кстати, похоже он и был в памяти(файл в 18Мб, свободно около 200), видимо для сдвига строк (D) sed применяет следующую оптимизацию: вместо того, что-бы сдвигать весть буфер, она просто считает, что после команды D буфер начинается не с первой, а со второй строки, надо исходник глянуть). В любом случае, двигать буфер на каждой строке без особой на то необходимости - плохая идея.) Проблема sed в данном случае: невозможность загружать строки в произвольное место буфера, мы можем только добавлять в конец буфера, или полностью заменить строку. С другой стороны, значительного увеличения быстродействия можно было-бы достичь другим путём: прочитать все строки, а после этого вернутся на 10 строк назад, если известна максимальная длинна строки(M), то это сделать довольно просто: посчитать все строки, а затем вернутся на M*10 байтов назад и найти десятую строчку, я, правда не знаю, чем возвращаться, разве что той-же tail с ключом -c.

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

ZyX писал(а):
06.06.2012 08:59
? Обычно никто не открывает /dev/stdin прямо, а используют уже имеющиеся дескрипторы. И я вообще не слишком понял, к чему это.

ну открывает cat в первом случае, и другая утилита во втором.
ZyX писал(а):
06.06.2012 08:59
Поэтому grep, sed и perl — одни из немногих утилит, про которые я точно знаю, что они принимают имя файла.

дык ВСЕ принимают. Если это имеет смысл конечно.
ZyX писал(а):
06.06.2012 08:59
Чупа‐чупс пальцем не заменяется.

тут яхз. Мои сыновья их не сосут. Однако, глядя на других детей - наверное заменяется...
ZyX писал(а):
06.06.2012 08:59
А вещи, которые здесь обсуждаются, полностью взаимозаменяемы при большинстве условий использования.

возвращаемся к началу. Я не против, если Вам удобнее, применяйте ЛЮБЫЕ конструкции. Советовать не нужно.
ZyX писал(а):
06.06.2012 08:59
Нет, не для всего. Нам надо сделать операцию над содержимым файла(ов) (нас не интересует ничего, кроме содержимого) — используем cat. Надо над самими файлами (т.е. над содержимым, его именем и/или местом физического расположения) — не используем cat.

sed по дефолту и не применяет разбивку файлов на файлы.
http://drbatty.ru/sed/ch06.html ищите про --separate
т.е. sed работает в точности как cat по умолчанию. Так какой смысл в конструкции cat|sed? Фобия?
ZyX писал(а):
06.06.2012 08:59
Есть ещё одна вещь: less file.html против cat file.html | less. Мне совершенно неохота знать, каким ключом отключается его текущее поведение (и каким включается обратно когда понадобиться).

дык Ваша Любимая less пытается сделать как лучше... Не нравится? Дык html лучше открывать Internet Exploer'ом, как все нормальные люди.
ZyX писал(а):
06.06.2012 08:59
Где? Я только нашёл жутко устаревший ssed.

ну это в сырцах было, когда я книжку про sed писал. А сейчас не знаю. Вырезали? Вряд ли...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: [Решено] Переменная в аргументах редактора sed

Сообщение ZyX »

drBatty писал(а):
06.06.2012 10:38
ZyX писал(а):
06.06.2012 08:59
? Обычно никто не открывает /dev/stdin прямо, а используют уже имеющиеся дескрипторы. И я вообще не слишком понял, к чему это.

ну открывает cat в первом случае, и другая утилита во втором.

cat не открывает /dev/stdin, если только не указать его в аргументах. Можете сами проверить: strace -e open cat.
drBatty писал(а):
06.06.2012 10:38
ZyX писал(а):
06.06.2012 08:59
Поэтому grep, sed и perl — одни из немногих утилит, про которые я точно знаю, что они принимают имя файла.

дык ВСЕ принимают. Если это имеет смысл конечно.

coreutils — может быть и все. У других поведение зачастую отличается, иногда сильно (less file.html, unxz file.xz, …).
drBatty писал(а):
06.06.2012 10:38
тут яхз. Мои сыновья их не сосут. Однако, глядя на других детей - наверное заменяется...

Замена неполная — это точно. Надеюсь вы не хотите сказать, что палец у детей имеет … вкус?
drBatty писал(а):
06.06.2012 10:38
возвращаемся к началу. Я не против, если Вам удобнее, применяйте ЛЮБЫЕ конструкции. Советовать не нужно.

Я так и не понял, почему. Эффект от присутствия «лишней сущности» пренебрежимо мал по сравнению с затратами sed’а на обработку потока, других аргументов я не видел.
drBatty писал(а):
06.06.2012 10:38
ZyX писал(а):
06.06.2012 08:59
Нет, не для всего. Нам надо сделать операцию над содержимым файла(ов) (нас не интересует ничего, кроме содержимого) — используем cat. Надо над самими файлами (т.е. над содержимым, его именем и/или местом физического расположения) — не используем cat.

sed по дефолту и не применяет разбивку файлов на файлы.
http://drbatty.ru/sed/ch06.html ищите про --separate
т.е. sed работает в точности как cat по умолчанию. Так какой смысл в конструкции cat|sed? Фобия?

Поэтому sed с именем файла мною применяется только с ключом -i.
drBatty писал(а):
06.06.2012 10:38
дык Ваша Любимая less пытается сделать как лучше... Не нравится? Дык html лучше открывать Internet Exploer'ом, как все нормальные люди.

Вопрос не в этом, такое поведение иногда даже удобно. Вопрос в том, что при использовании cat less ведёт себя «как обычно», а без него — нет.
drBatty писал(а):
06.06.2012 10:38
ну это в сырцах было, когда я книжку про sed писал. А сейчас не знаю. Вырезали? Вряд ли...

Если бы был рабочий вариант в исходном коде, то maintain’еры наверняка бы добавили USE=pcre, как для grep. Этого не наблюдается.

Посмотрел в исходный код: люди нагло спёрли тесты, используемые libpcre и адаптировали их под libc ERE. Больше ничего.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

ZyX писал(а):
07.06.2012 02:11
cat не открывает /dev/stdin, если только не указать его в аргументах. Можете сами проверить: strace -e open cat.

$

echo | cat


ZyX писал(а):
07.06.2012 02:11
дык ВСЕ принимают. Если это имеет смысл конечно.

coreutils — может быть и все. У других поведение зачастую отличается, иногда сильно (less file.html, unxz file.xz, …).

unxz обычно не имеет смысла над stdin, как и например gpg --encrypt.
ZyX писал(а):
07.06.2012 02:11
Замена неполная — это точно. Надеюсь вы не хотите сказать, что палец у детей имеет … вкус?

замена неполная. О чём и речь. А вкус тут не причём, дети просто психологически успокаиваются, когда сиську сосут. Даже когда молока нет.
ZyX писал(а):
07.06.2012 02:11
Я так и не понял, почему. Эффект от присутствия «лишней сущности» пренебрежимо мал по сравнению с затратами sed’а на обработку потока, других аргументов я не видел.

а аргументы Вы должны приводить, ЗАЧЕМ нужна эта лишняя сущность?
ZyX писал(а):
07.06.2012 02:11

sed по дефолту и не применяет разбивку файлов на файлы.
http://drbatty.ru/sed/ch06.html ищите про --separate
т.е. sed работает в точности как cat по умолчанию. Так какой смысл в конструкции cat|sed? Фобия?

Поэтому sed с именем файла мною применяется только с ключом -i.

фобия?

ZyX писал(а):
07.06.2012 02:11
Вопрос не в этом, такое поведение иногда даже удобно. Вопрос в том, что при использовании cat less ведёт себя «как обычно», а без него — нет.

хм... ну? ну вы таки хотите СПЕЦИАЛЬНЫЙ случай - пожалуйста, можете даже не лезть в ман...
ZyX писал(а):
07.06.2012 02:11
Если бы был рабочий вариант в исходном коде, то maintain’еры наверняка бы добавили USE=pcre, как для grep. Этого не наблюдается.

угу. потому-что не работает. ну у меня не получилось.
ZyX писал(а):
07.06.2012 02:11
Посмотрел в исходный код: люди нагло спёрли тесты, используемые libpcre и адаптировали их под libc ERE. Больше ничего.

ага. украли... ваще-то это GNU, тут не крадут код, возвращайтесь в уютную семёрочку...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Решено] Переменная в аргументах редактора sed

Сообщение watashiwa_daredeska »

drBatty писал(а):
07.06.2012 09:05
ЗАЧЕМ нужна эта лишняя сущность?
1. Например, для удобства отладки пайплайна. Иногда в процессе построения и отладки требуется заменить первую команду в пайплайне. Это удобнее делать, когда пайплайн изолирован и перед ним стоит cat|.
2. Например, когда в скрипте вместо cat может быть что-то еще, выбираемое автоматически:

Код: Выделить всё

case $filename in
  *.gz) CAT=gzip -dc ;;
  *.bz2) CAT=bzip2 -dc ;;
  *) CAT=cat ;;
esac
$CAT $filename | bla-bla-bla

3. В публикуемых материалах (например, на форуме), для подчеркивания того, что то, что следует за cat| является пайплайном и может работать в поточном режиме, а не требовать обязательно файл. Ибо при указании имени файла в аргументах к произвольной команде остается неясным, требуется ли команде лишь последовательный доступ, либо нужен random access.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5272
ОС: Gentoo

Re: [Решено] Переменная в аргументах редактора sed

Сообщение /dev/random »

drBatty писал(а):
07.06.2012 09:05
ZyX писал(а):
07.06.2012 02:11
cat не открывает /dev/stdin, если только не указать его в аргументах. Можете сами проверить: strace -e open cat.

$

echo | cat



Этим вы доказали, что cat из stdin _читает_. Но утверждение ZyX о том, что cat его не _открывает_, вы не опровергли. Stdin, stdout и stderr наследуются процессами в уже открытом виде.

Upd: сорри, в сообщении была ошибка: я написал "strace" вместо "cat". Исправил.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: [Решено] Переменная в аргументах редактора sed

Сообщение ZyX »

drBatty писал(а):
07.06.2012 09:05
unxz обычно не имеет смысла над stdin, как и например gpg --encrypt.

cat | unxz делает то же, что и xzcat.
drBatty писал(а):
07.06.2012 09:05
ZyX писал(а):
07.06.2012 02:11
Замена неполная — это точно. Надеюсь вы не хотите сказать, что палец у детей имеет … вкус?

замена неполная. О чём и речь. А вкус тут не причём, дети просто психологически успокаиваются, когда сиську сосут. Даже когда молока нет.

В рассматриваемых случаях замена полная.
drBatty писал(а):
07.06.2012 09:05
ZyX писал(а):
07.06.2012 02:11
Я так и не понял, почему. Эффект от присутствия «лишней сущности» пренебрежимо мал по сравнению с затратами sed’а на обработку потока, других аргументов я не видел.

а аргументы Вы должны приводить, ЗАЧЕМ нужна эта лишняя сущность?

Я их уже привёл.
drBatty писал(а):
07.06.2012 09:05
ZyX писал(а):
07.06.2012 02:11

sed по дефолту и не применяет разбивку файлов на файлы.
http://drbatty.ru/sed/ch06.html ищите про --separate
т.е. sed работает в точности как cat по умолчанию. Так какой смысл в конструкции cat|sed? Фобия?

Поэтому sed с именем файла мною применяется только с ключом -i.

фобия?

Нет, просто унификация подхода. Кроме того, я тем самым не оставляю sed’у никаких шансов на обработку различных файлов отдельно и знаю об этом. Он же не утилита для склеивания файлов, в отличие от cat.
drBatty писал(а):
07.06.2012 09:05
ZyX писал(а):
07.06.2012 02:11
Посмотрел в исходный код: люди нагло спёрли тесты, используемые libpcre и адаптировали их под libc ERE. Больше ничего.

ага. украли... ваще-то это GNU, тут не крадут код, возвращайтесь в уютную семёрочку...

На моём компьютере никогда не стояла Microsoft® Windows™ 7.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

/dev/random писал(а):
07.06.2012 17:19
Этим вы доказали, что cat из stdin _читает_. Но утверждение ZyX о том, что cat его не _открывает_, вы не опровергли. Stdin, stdout и stderr наследуются процессами в уже открытом виде.

ну дык это его утверждение не имеет смысла. я изначально говорил про чтение.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: [Решено] Переменная в аргументах редактора sed

Сообщение ZyX »

drBatty писал(а):
07.06.2012 20:20
/dev/random писал(а):
07.06.2012 17:19
Этим вы доказали, что cat из stdin _читает_. Но утверждение ZyX о том, что cat его не _открывает_, вы не опровергли. Stdin, stdout и stderr наследуются процессами в уже открытом виде.

ну дык это его утверждение не имеет смысла. я изначально говорил про чтение.

Никто из перечисленных программ не читает /dev/stdin. Вы можете вообще удалить эту символическую ссылку на /proc/self/fd/0, они продолжат работать. Или даже сделать chroot в место, где нет ни /proc, ни /dev. Всё, что делают эти программы — это используют полученный от родителя дескриптор. Никакого «файла по умолчанию» нет. Возможности избежать создания трёх стандартных дескрипторов тоже нет (во всяком случае, без модификации исходного кода запускающей программы оболочки). Об этом я и говорю.

Кроме того:
drBatty писал(а):
06.06.2012 10:38
ZyX писал(а):
06.06.2012 08:59
? Обычно никто не открывает /dev/stdin прямо, а используют уже имеющиеся дескрипторы. И я вообще не слишком понял, к чему это.

ну открывает cat в первом случае, и другая утилита во втором.

Это точно не мои слова.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

ZyX писал(а):
07.06.2012 23:46
Никто из перечисленных программ не читает /dev/stdin. Вы можете вообще удалить эту символическую ссылку на /proc/self/fd/0

ну пусть будет "программы читают /proc/self/fd/0", если вам так будет удобнее.
ZyX писал(а):
07.06.2012 23:46
Всё, что делают эти программы — это используют полученный от родителя дескриптор. Никакого «файла по умолчанию» нет.

не открывают, ну и какое это имеет отношение к нашему спору? Я говорил о _чтении_ файла, причём тут "открытие"?

Если command file просто открывает файл, то cat file| command действует почти также, только открывает файл cat, потом через другой файл (/dev/stdout он же /dev/stdin для command) передаёт байты в command. Зачем эти лишние сложности?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: [Решено] Переменная в аргументах редактора sed

Сообщение ZyX »

drBatty писал(а):
08.06.2012 07:57
ZyX писал(а):
07.06.2012 23:46
Никто из перечисленных программ не читает /dev/stdin. Вы можете вообще удалить эту символическую ссылку на /proc/self/fd/0

ну пусть будет "программы читают /proc/self/fd/0", если вам так будет удобнее.
ZyX писал(а):
07.06.2012 23:46
Всё, что делают эти программы — это используют полученный от родителя дескриптор. Никакого «файла по умолчанию» нет.

не открывают, ну и какое это имеет отношение к нашему спору? Я говорил о _чтении_ файла, причём тут "открытие"?

Вы говорили в том числе и об открытии. Цитату я уже привёл.

drBatty писал(а):
08.06.2012 07:57
Если command file просто открывает файл, то cat file| command действует почти также, только открывает файл cat, потом через другой файл (/dev/stdout он же /dev/stdin для command) передаёт байты в command. Зачем эти лишние сложности?

Дескрипторы — не файлы. /proc/self/fd/N — это просто удобное в некоторых случаях представление, которого при желании может и вовсе не быть. И не надо в который раз спрашивать, зачем. На этот вопрос ответили и я, и watashiwa_daredeska .
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

ZyX писал(а):
08.06.2012 08:10
Вы говорили в том числе и об открытии. Цитату я уже привёл.

в вашем случае открывает cat, что это меняет?
ZyX писал(а):
08.06.2012 08:10
Дескрипторы — не файлы. /proc/self/fd/N — это просто удобное в некоторых случаях представление, которого при желании может и вовсе не быть.

да? где об этом можно поподробнее почитать?
ZyX писал(а):
08.06.2012 08:10
И не надо в который раз спрашивать, зачем. На этот вопрос ответили и я, и watashiwa_daredeska *.

да, я помню:
1. некоторые команды не умеют открывать файлы, потому их надо кормить через stdin. (правда я так и не понял - какие)
2. некоторые команды пытаются открывать файл в соответствии с именем, например у меня less открывает *.gz файлы предварительно их распаковав, а у вас html как-то по особому открывает. Вот вам и проиходится юзать cat file.html | less, ибо зачем смотреть html как html? Это же глупо!
3. во всех случаях вам легче заменить cat оооченьььбоооольшоеимяфааайла | sed '' чем sed '' оооченьььбоооольшоеимяфааайла
4. команда пишется по частям, и начинать надо с команды, которая ничего не делает (cat), почему нельзя юзать например sed '' - мне неведомо, а вам ещё и догадаться надо, что sed '' работает в точности как cat...

ИМХО - неубедительно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Решено] Переменная в аргументах редактора sed

Сообщение watashiwa_daredeska »

drBatty писал(а):
08.06.2012 08:27
начинать надо с команды, которая ничего не делает (cat), почему нельзя юзать например sed '' - мне неведомо
Можно и с sed '' -. А эта команда делает что-то полезное по сравнению с cat, кроме того, что тормозит в 3 раза сильнее?

P.S. Еще можно с dd начинать или с LC_ALL=C grep -ah . или с … Да много с чего можно, но зачем, когда есть просто cat?
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: [Решено] Переменная в аргументах редактора sed

Сообщение ZyX »

drBatty писал(а):
08.06.2012 08:27
ZyX писал(а):
08.06.2012 08:10
Вы говорили в том числе и об открытии. Цитату я уже привёл.

в вашем случае открывает cat, что это меняет?

Возьмите наконец strace. cat не открывает ни /dev/stdin, ни /dev/stdout, ни /dev/stderr. Дескрипторы создаются оболочкой (за исключением stderr, первого stdin и последнего stdout, которые сама оболочка наследует), но она тоже ничего из этого не открывает.
drBatty писал(а):
08.06.2012 08:27
ZyX писал(а):
08.06.2012 08:10
Дескрипторы — не файлы. /proc/self/fd/N — это просто удобное в некоторых случаях представление, которого при желании может и вовсе не быть.

да? где об этом можно поподробнее почитать?

Понятия не имею. Мои слова проверяются простым скриптом:

(Created by format.vim)

mkdir -p chroot/{lib64,bin} for d in lib64 bin ; do mount -o bind /$d chroot/$d done chroot chroot sh # Внутри chroot echo abc | cat


cat у меня здесь работает, но, очевидно, что она ну никак не может открыть файлы, которых просто нет: в окружении примонтированы всего два каталога, /proc и /dev нету.
drBatty писал(а):
08.06.2012 08:27
ZyX писал(а):
08.06.2012 08:10
И не надо в который раз спрашивать, зачем. На этот вопрос ответили и я, и watashiwa_daredeska *.

да, я помню:
1. некоторые команды не умеют открывать файлы, потому их надо кормить через stdin. (правда я так и не понял - какие)
2. некоторые команды пытаются открывать файл в соответствии с именем, например у меня less открывает *.gz файлы предварительно их распаковав, а у вас html как-то по особому открывает. Вот вам и проиходится юзать cat file.html | less, ибо зачем смотреть html как html? Это же глупо!
3. во всех случаях вам легче заменить cat оооченьььбоооольшоеимяфааайла | sed '' чем sed '' оооченьььбоооольшоеимяфааайла
4. команда пишется по частям, и начинать надо с команды, которая ничего не делает (cat), почему нельзя юзать например sed '' - мне неведомо, а вам ещё и догадаться надо, что sed '' работает в точности как cat...

ИМХО - неубедительно.

cat не «ничего не делает», она выводит файл. Таким образом я, к тому же, уверен, что совершаю операцию над содержимым файла и (если я не сделаю очевидной глупости вроде cat file > file) файл не будет изменён. К тому же, вы проигнорировали ещё три аргумента, высказанные не мною.

И я никогда не говорил, что «некоторые команды не умеют открывать файлы». Я говорил, что 1. я не хочу знать, умеют ли используемые команды открывать файл нужным способом и 2. у некоторых команд поведение при открытии файла отличается.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение diesel »

drBatty писал(а):
08.06.2012 08:27
4. команда пишется по частям, и начинать надо с команды, которая ничего не делает (cat), почему нельзя юзать например sed '' - мне неведомо, а вам ещё и догадаться надо, что sed '' работает в точности как cat...



команда пишется по частям. а потом исполняется на очень большом файле, и сохраняется в другой файл. не ново в принципе. делается(ок, я делаю) это обычно так: head very-big-file | cmd1 <- посмотрели результат, если надо поправили, head very-big-file | cmd1 | cmd2 <- посмотрели результат, поправили, head very-big-file | cmd1|...|cmdN <- посмотрели результат, если надо поправили. После этого перемещаемся в начало строки, убираем head, ставим cat, редиректим вывод в другой файл. да, безусловно, крутые чуваки пишут все в седе, или трехметровые строчки шелла без ошибок, с первого раза, но на то они и крутые чуваки.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

watashiwa_darede... писал(а):
08.06.2012 10:31
почему нельзя юзать например sed '' - мне неведомо

Можно и с sed '' -. А эта команда делает что-то полезное по сравнению с cat, кроме того, что тормозит в 3 раза сильнее?

да, в эту команду можно вписать какой-нить sed-скрипт.
watashiwa_darede... писал(а):
08.06.2012 10:31
Да много с чего можно, но зачем, когда есть просто cat?

фишка в том, что можно и без cat.
ZyX писал(а):
08.06.2012 19:18
Возьмите наконец strace. cat не открывает ни /dev/stdin, ни /dev/stdout, ни /dev/stderr. Дескрипторы создаются оболочкой (за исключением stderr, первого stdin и последнего stdout, которые сама оболочка наследует), но она тоже ничего из этого не открывает.

cat открывает файл, который передан в качестве параметра, и заталкивает его построчно в pipe, который создан оболочкой. Следующая команда читает этот pipe.
ZyX писал(а):
08.06.2012 19:18
cat у меня здесь работает, но, очевидно, что она ну никак не может открыть файлы, которых просто нет: в окружении примонтированы всего два каталога, /proc и /dev нету.

ну файл вовсе и не обязан входить в файловую систему. Кроме pipe можно вспомнить например удалённые файлы, которые тоже нигде не находятся, но это не мешает им существовать (до тех пор, пока они не будут закрыты). Pipe как раз и называются "не именованная очередь", в отличие от именованной named pipe, и имени строго говоря не имеет (т.е. не входит в ФС), я называю этот файл /dev/stdin, потому как для удобства есть ссылка на этот файл внутри ФС, но вы сами только-что доказали, что эта ссылка (имя) не является обязательной. Однако, разве это доказывает, что pipe файла не существует? ИМХО нет.
ZyX писал(а):
08.06.2012 19:18
cat не «ничего не делает», она выводит файл.

cat ничего не делает с содержимым строк, однако, ей приходится построчно читать файл(ы), и построчно писать это всё в pipe. Она их(строки) ещё умеет нумеровать. Т.е. некий функционал у cat всё-же есть. Проблема в том, что этот функционал есть и у sed, и у других утилит, для которых это имеет смысл. Причём куда лучше использовать функционал этих утилит, ибо они хотя-бы знают, ЧТО они читают. Вот grep например может показывать не только ЧТО найдено, но и ГДЕ найдено, если файлов много. А вот sed умеет редактировать на месте. Но всё это лишь без использования cat.
Ну вот вам простой пример: я хочу отредактировать конфиг. Но я точно не знаю, что в этом конфиге, и как его править. Очевидно, что конструкция cat config|sed 'script' мне покажет то, что нужно, и всё сделает правильно, однако выполнить cat config|sed 'script' >config уже не получится... А вот sed 'script' config -i отработает так, как надо.
ZyX писал(а):
08.06.2012 19:18
Таким образом я, к тому же, уверен, что совершаю операцию над содержимым файла и (если я не сделаю очевидной глупости вроде cat file > file) файл не будет изменён.

можно подумать, что я не уверен в том, что sed не меняет файлы, без явного на то указания. Мало того, sed ещё и бекапы умеет делать, а для pipe'ов это совсем не просто (cat config | sed 'script' >tmp; mv convig{,.bak}; mv tmp config, против sed -i*.bak 'script' config)
ZyX писал(а):
08.06.2012 19:18
К тому же, вы проигнорировали ещё три аргумента, высказанные не мною.

не проигнорировал.
ZyX писал(а):
08.06.2012 19:18
И я никогда не говорил, что «некоторые команды не умеют открывать файлы». Я говорил, что
1. я не хочу знать, умеют ли используемые команды открывать файл нужным способом и
2. у некоторых команд поведение при открытии файла отличается.

1. не принимается. Если вы открываете бутыль штопором, вам надо мануал почитать, к вашим хитрым бутылкам и к хитрому штопору. У меня таких проблем нет - обычный штопор с лёгкостью открывает стандартные бутылки. Других мне не встречалось.
2. не принимается. Это же утверждение можно перефразировать так: у некоторых команд изменяется поведение при чтении/записи в pipe. К примеру моя ls раскрашивает файлы, однако, если прогнать вывод через cat он ВНЕЗАПНО станет чёрно-белым. Но вы почему-то не предлагаете использовать ls|cat. Почему? Вот ещё пример: моя less печатет всегда pipe как есть, но какой смысл просматривать например /usr/man/man1/less.1.gz as is? Вот less его и распаковывает. Для вас это неожиданность? А для меня неожиданность получить полный экран нечитаемого мусора.

diesel писал(а):
08.06.2012 20:00
После этого перемещаемся в начало строки, убираем head, ставим cat, редиректим вывод в другой файл. да, безусловно, крутые чуваки пишут все в седе, или трехметровые строчки шелла без ошибок, с первого раза, но на то они и крутые чуваки.

не... Крутые чуваки просто знакомы с командой 10q, которая прерывает sed-скрипт на десятой строке. Т.ч. head тут просто не нужна. Т.е. опять мимо кассы.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Решено] Переменная в аргументах редактора sed

Сообщение watashiwa_daredeska »

drBatty писал(а):
08.06.2012 20:28
да, в эту команду можно вписать какой-нить sed-скрипт.
А мне не нужен sed-скрипт.

drBatty писал(а):
08.06.2012 20:28
фишка в том, что можно и без cat.
Можно, но с cat удобнее.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

watashiwa_darede... писал(а):
08.06.2012 20:32
А мне не нужен sed-скрипт.

а ТСу нужен. Т.ч. вопрос не ко мне, я про данный конкретный случай говорю, а не "вообще". А "вообще" cat годная и нужная команда, с этим я не спорю.
watashiwa_darede... писал(а):
08.06.2012 20:32
Можно, но с cat удобнее.

см. выше.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Решено] Переменная в аргументах редактора sed

Сообщение watashiwa_daredeska »

drBatty писал(а):
08.06.2012 20:53
Т.ч. вопрос не ко мне, я про данный конкретный случай говорю, а не "вообще".
А кто сказал, что данный конкретный случай заключается лишь в одной этой команде? Вполне возможно, что на самом деле у ТС вместо cat стоит длинный пайплайн, а в пост cat вставлен с чисто демонстрационными целями (см. случай 3), либо ТС строит длинный пайплайн и кроме/вместо sed после cat подставлялось/убиралось что-то другое (см. случай 1).

Так что, вопрос о гнилых придирках именно к Вам. ТС не ставил вопрос о cat, не приводил реальный полный пайплайн, cat ему никто не советовал, это всё просто примеры.

Вы экзамен на профпригодность ЛОРовского анонимуса что ль сдаете? В стиле
— Товарищ младший сержант, вот Вам столб, придеритесь к нему, используя свой
опыт.
— Это я мигом! Окопался, значит, чуждый нам элемент. Вверху провода - связи
имеет. Объявление висит - спекуляцией занимается. Без волос - у наших побывал
недавно. И вообще гудит, стоит не на том месте.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

watashiwa_darede... писал(а):
08.06.2012 21:40
Так что, вопрос о гнилых придирках именно к Вам. ТС не ставил вопрос о cat, не приводил реальный полный пайплайн, cat ему никто не советовал, это всё просто примеры.

ну если это "просто пример", то вопросов больше нет. Хотя мне что-то подсказывает, что многие таки IRL действительно пишут cat file.txt | command.
watashiwa_darede... писал(а):
08.06.2012 21:40
Вы экзамен на профпригодность ЛОРовского анонимуса что ль сдаете? В стиле

ну типа того (:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: [Решено] Переменная в аргументах редактора sed

Сообщение ZyX »

drBatty писал(а):
08.06.2012 20:28
cat открывает файл, который передан в качестве параметра, и заталкивает его построчно в pipe, который создан оболочкой. Следующая команда читает этот pipe.

strace говорит, что cat плевать на строчки, читает и пишет она у меня блоками по 32768 байт.
drBatty писал(а):
08.06.2012 20:28
ну файл вовсе и не обязан входить в файловую систему. Кроме pipe можно вспомнить например удалённые файлы, которые тоже нигде не находятся, но это не мешает им существовать (до тех пор, пока они не будут закрыты). Pipe как раз и называются "не именованная очередь", в отличие от именованной named pipe, и имени строго говоря не имеет (т.е. не входит в ФС), я называю этот файл /dev/stdin, потому как для удобства есть ссылка на этот файл внутри ФС, но вы сами только-что доказали, что эта ссылка (имя) не является обязательной. Однако, разве это доказывает, что pipe файла не существует? ИМХО нет.

Это уже вопрос терминологии. Под первое определение из википедии легко попадает даже Python’овский StringIO объект (и вообще любой с методами .read() и .write()). Под второе — вообще любая переменная. Я же всегда считал файлами только то, что находится в файловой системе (точнее, не существует без неё). Дескрипторы же наличия файловой системы не требуют. Так что, если брать определение из wikipedia, то я здесь неправ.

drBatty писал(а):
08.06.2012 20:28
cat ничего не делает с содержимым строк, однако, ей приходится построчно читать файл(ы), и построчно писать это всё в pipe. Она их(строки) ещё умеет нумеровать. Т.е. некий функционал у cat всё-же есть. Проблема в том, что этот функционал есть и у sed, и у других утилит, для которых это имеет смысл. Причём куда лучше использовать функционал этих утилит, ибо они хотя-бы знают, ЧТО они читают. Вот grep например может показывать не только ЧТО найдено, но и ГДЕ найдено, если файлов много. А вот sed умеет редактировать на месте. Но всё это лишь без использования cat.

Я уже сказал: мне нужна операция над файлами — не использую cat. Не нужна, нужна только над содержимым — использую. К тому же, могу быть уверен, что cat | … будет воспринято правильно и файл изменён не будет. Можете ответить, зачем мне давать программе информацию, в которой она совершенно не нуждается для выполнения данной задачи?

drBatty писал(а):
08.06.2012 20:28
Ну вот вам простой пример: я хочу отредактировать конфиг. Но я точно не знаю, что в этом конфиге, и как его править. Очевидно, что конструкция cat config|sed 'script' мне покажет то, что нужно, и всё сделает правильно, однако выполнить cat config|sed 'script' >config уже не получится... А вот sed 'script' config -i отработает так, как надо.

Всегда использовал vim в данном случае. Но если хотите, есть sponge из moreutils.

drBatty писал(а):
08.06.2012 20:28
ZyX писал(а):
08.06.2012 19:18
Таким образом я, к тому же, уверен, что совершаю операцию над содержимым файла и (если я не сделаю очевидной глупости вроде cat file > file) файл не будет изменён.

можно подумать, что я не уверен в том, что sed не меняет файлы, без явного на то указания. Мало того, sed ещё и бекапы умеет делать, а для pipe'ов это совсем не просто (cat config | sed 'script' >tmp; mv convig{,.bak}; mv tmp config, против sed -i*.bak 'script' config)

vim. Он умеет и хранить такие бэкапы в одном месте, и имеет persistent undo, благодаря которому оные мне ни разу ни требовались. Точно так же присутствует почти везде и, помимо прочего, может всё, что может sed.

drBatty писал(а):
08.06.2012 20:28
ZyX писал(а):
08.06.2012 19:18
К тому же, вы проигнорировали ещё три аргумента, высказанные не мною.

не проигнорировал.

Где? Я не вижу на них ответа.
drBatty писал(а):
08.06.2012 20:28
1. не принимается. Если вы открываете бутыль штопором, вам надо мануал почитать, к вашим хитрым бутылкам и к хитрому штопору. У меня таких проблем нет - обычный штопор с лёгкостью открывает стандартные бутылки. Других мне не встречалось.
2. не принимается. Это же утверждение можно перефразировать так: у некоторых команд изменяется поведение при чтении/записи в pipe. К примеру моя ls раскрашивает файлы, однако, если прогнать вывод через cat он ВНЕЗАПНО станет чёрно-белым. Но вы почему-то не предлагаете использовать ls|cat. Почему? Вот ещё пример: моя less печатет всегда pipe как есть, но какой смысл просматривать например /usr/man/man1/less.1.gz as is? Вот less его и распаковывает. Для вас это неожиданность? А для меня неожиданность получить полный экран нечитаемого мусора.

1. С какой радости та же cut вообще обязана открывать файл? Это не её задача. Здесь штопор и бутылки то же стандартные, просто вы используете штопор, в который вставили насос, а я открываю бутылку обычным штопором и вставляю насос так.
2. Это не неожиданность, но если мне надо что‐то распаковать, я сам скажу об этом.
drBatty писал(а):
08.06.2012 20:28
не... Крутые чуваки просто знакомы с командой 10q, которая прерывает sed-скрипт на десятой строке. Т.ч. head тут просто не нужна. Т.е. опять мимо кассы.

Скажите, что проще понять — cat | head -n 10 | sed s/// или sed '10q;s///'? Мало удовольствия учить зашифрованные в одну букву команды, когда есть нормально выглядящие аналоги. Как я полагаю, tail будет чем‐то вроде 1,$-5d? Это действительно лучше tail -n 4?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

ZyX писал(а):
09.06.2012 19:22
strace говорит, что cat плевать на строчки, читает и пишет она у меня блоками по 32768 байт.

ну и что? у меня ЕМНИП по 65536 читала. смысл ей читать именно по строчкам, если в данной ситуации можно и так? Кстати, макрос fgetc(3) тоже читает у меня по 65536 байт, и что?

>Я же всегда считал файлами только то, что находится в файловой системе (точнее, не существует без неё). Дескрипторы же наличия файловой системы не требуют. Так что, если брать определение из wikipedia, то я здесь неправ.

ну тогда все мои вышесказанные слова вы поняли неправильно. Ибо я файлом считал сущность, у которой есть файловый дескриптор, и в которую можно читать/писать, например тем же макросом fgetc(3) (и другими). stdin по определению подходит, ибо есть getchar(3), которая как раз и читает из потока stdin. Ну а поток (FILE*) как известно привязан к файловому дескриптору, а следовательно и к файлу, в моём понимании конечно.
Что там в вике написано - меня тоже абсолютно не волнует.

>Не нужна, нужна только над содержимым — использую. К тому же, могу быть уверен, что cat | … будет воспринято правильно и файл изменён не будет. Можете ответить, зачем мне давать программе информацию, в которой она совершенно не нуждается для выполнения данной задачи?

конечно могу: вы зачем-то cat эту информацию даёте, а другой команде - не даёте. С другой стороны, признайтесь, что случай по умолчанию таки удобнее, как например просто удобно просматривать распакованный файл командой less. А уж если вам так хочется скрыть эту информацию, то вот тут-то cat и пригодится.
Однако, в случае ТСа, и в большинстве практических случаев, скрывать не нужно.
ZyX писал(а):
09.06.2012 19:22
Всегда использовал vim в данном случае.

а если надо исправить 40 файлов, причём одинаковым способом? Это вполне себе случай из практики. Вот как работает пакетный режим в vim - лично я не помню, как-то хитро, ибо vim не для того предназначен.
ZyX писал(а):
09.06.2012 19:22
Но если хотите, есть sponge из moreutils.

нету. ну вот нету на серверах. да и на десктопе тоже нет. И качать/компилять/ставить мне лень.
ZyX писал(а):
09.06.2012 19:22
vim. Он умеет и хранить такие бэкапы в одном месте, и имеет persistent undo, благодаря которому оные мне ни разу ни требовались.

это я всё знаю. и даже ещё и использую.
ZyX писал(а):
09.06.2012 19:22
Точно так же присутствует почти везде и, помимо прочего, может всё, что может sed.

не всё. Пакетный режим в vim совершенно неюзабельный. Что надеюсь очевидно. Если вам это не нужно - так вообще зачем вы заладили этот спор? Мы же в конце концов про командную строку...
Кстати, вы тоже пишете cat file | vim, или тут без cat? А что ж так? (:
ZyX писал(а):
09.06.2012 19:22
1. С какой радости та же cut вообще обязана открывать файл? Это не её задача.

не знаю...
NAME
cut - remove sections from each line of files

если что: Report cut bugs to bug-coreutils@gnu.org
ZyX писал(а):
09.06.2012 19:22
Здесь штопор и бутылки то же стандартные, просто вы используете штопор, в который вставили насос, а я открываю бутылку обычным штопором и вставляю насос так.

у меня нет никаких "насосов", просто штопор и всё.
ZyX писал(а):
09.06.2012 19:22
2. Это не неожиданность, но если мне надо что‐то распаковать, я сам скажу об этом.

да? вы мне сейчас с ходу расскажите, где в моей системе выставляется раскраска для ls? или расскажите о том почему less в моей системе, и в CentOS5 распаковывает gz, а вот в Debian - не хочет?
ZyX писал(а):
09.06.2012 19:22
1.Скажите, что проще понять — cat | head -n 10 | sed s/// или sed '10q;s///'?
2.Мало удовольствия учить зашифрованные в одну букву команды, когда есть нормально выглядящие аналоги.
3.Как я полагаю, tail будет чем‐то вроде 1,$-5d? Это действительно лучше tail -n 4?

1. ну тут я не знаю. Я-бы написал возможно head | sed s///, так ИМХО проще и понятнее. Что до q10, то не надо мне тут было рассказывать, что sed такого не умеет, это не вам было сказано.
2. вопрос привычки. Речь ведь про cat, она тут лишняя по любому, ВНЕЗАПНО head тоже умеет имена файлов.
3. неправильно полагаете, sed просматривает файл 1 раз, и у неё нет подключения к libastral.so, что-бы догадаться, что _через_ 10 строк будет EOF (может вы там ручками набиваете строки?). Потому приходится применять дополнительный буфер, как и в tail.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [Решено] Переменная в аргументах редактора sed

Сообщение t.t »

drBatty писал(а):
08.06.2012 22:16
watashiwa_darede... писал(а):
08.06.2012 21:40
Так что, вопрос о гнилых придирках именно к Вам. ТС не ставил вопрос о cat, не приводил реальный полный пайплайн, cat ему никто не советовал, это всё просто примеры.
ну если это "просто пример", то вопросов больше нет. Хотя мне что-то подсказывает, что многие таки IRL действительно пишут cat file.txt | command.
Правильно подсказывает. Я, к примеру, пишу -- именно в тех случаях, в которых команда ведёт себя по-разному с указанием имён файлов и без него. Потому что, к примеру, от той же grep или, скажем, wc мне далеко не всегда нужна по-файловая статистика, часто я их запускаю только ради общего результата.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [Решено] Переменная в аргументах редактора sed

Сообщение t.t »

drBatty писал(а):
09.06.2012 20:03
ZyX писал(а):
09.06.2012 19:22
Но если хотите, есть sponge из moreutils.
нету. ну вот нету на серверах. да и на десктопе тоже нет. И качать/компилять/ставить мне лень.
Значит у нас с Вами разная лень. (: Мне обычно не лень поставить пакет, который не раз мне сэкономит время. Вы ведь, наверное, догадываетесь, за что многие sed не любят. Скрипт из shell-овских команд это самодокументированный код. А когда я, скажем, нашёл пару своих же скриптов на sed, но написанных больше года назад и без комментариев, полчаса потратил, чтобы понять, что именно они делают.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [Решено] Переменная в аргументах редактора sed

Сообщение t.t »

drBatty писал(а):
09.06.2012 20:03
или расскажите о том почему less в моей системе, и в CentOS5 распаковывает gz, а вот в Debian - не хочет?
Об этом и я расскажу. Потому что разработчики Debian правильно понимают принцип "do one thing and do it well". Распаковывать это не задача команды less. Для этого есть zless, zcat и gunzip. Потому что если я не сказал явно, что мне нужна распаковка, то программа не имеет права за меня об этом "догадываться".
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: [Решено] Переменная в аргументах редактора sed

Сообщение ZyX »

drBatty писал(а):
09.06.2012 20:03
ну и что? у меня ЕМНИП по 65536 читала. смысл ей читать именно по строчкам, если в данной ситуации можно и так? Кстати, макрос fgetc(3) тоже читает у меня по 65536 байт, и что?

Вы сказали, что она делает это построчно. Это не так.
drBatty писал(а):
09.06.2012 20:03
конечно могу: вы зачем-то cat эту информацию даёте, а другой команде - не даёте. С другой стороны, признайтесь, что случай по умолчанию таки удобнее, как например просто удобно просматривать распакованный файл командой less. А уж если вам так хочется скрыть эту информацию, то вот тут-то cat и пригодится.
Однако, в случае ТСа, и в большинстве практических случаев, скрывать не нужно.

cat она нужна — это её задача — взять содержимое файла. sed’у она не нужна в данном случае совершенно. Рассматривайте cat в данном случае как библиотечную функцию «open» с ограниченными возможностями.
drBatty писал(а):
09.06.2012 20:03
а если надо исправить 40 файлов, причём одинаковым способом? Это вполне себе случай из практики. Вот как работает пакетный режим в vim - лично я не помню, как-то хитро, ибо vim не для того предназначен.

Если надо исправить 40 файлов, то 1. дело отлаживается на одном, и это — копия 2. есть уже сделанные бэкапы (если конфиг — то он вообще в репозитории mercurial). «Пакетного режима» нет, но заскриптовать можно, впрочем, sed здесь действительно удобнее. У меня такое возникает весьма нечасто и 1+2 всегда хватало.
drBatty писал(а):
09.06.2012 20:03
не всё. Пакетный режим в vim совершенно неюзабельный. Что надеюсь очевидно. Если вам это не нужно - так вообще зачем вы заладили этот спор? Мы же в конце концов про командную строку...

Всё. Применять его к группе файлов действительно сложнее, но возможности у vim гораздо шире.
drBatty писал(а):
09.06.2012 20:03
Кстати, вы тоже пишете cat file | vim, или тут без cat? А что ж так? (:

Vim’у нужно знать, куда он пишет. Кроме того, с переходом на zsh у меня почему‐то сломались mc и cat | vim. Не были починены по причине слабой необходимости.
drBatty писал(а):
09.06.2012 20:03
> 1. С какой радости та же cut вообще обязана открывать файл? Это не её задача.

не знаю...
NAME
cut - remove sections from each line of files

если что: Report cut bugs to bug-coreutils@gnu.org

Так ведь обратная совместимость, не починят.
drBatty писал(а):
09.06.2012 20:03
> 2. Это не неожиданность, но если мне надо что‐то распаковать, я сам скажу об этом.

да? вы мне сейчас с ходу расскажите, где в моей системе выставляется раскраска для ls? или расскажите о том почему less в моей системе, и в CentOS5 распаковывает gz, а вот в Debian - не хочет?

Раз он где‐то не хочет, почему‐бы не использовать везде zcat явно? Это аргумент в мою пользу, а не наоборот: zcat file.gz | less будет работать, судя по всему, во всех трёх системах.

А раскраска ls, насколько я помню, в /etc/DIR_COLORS. man говорит, что это можно изменить в переменной LS_COLORS.
drBatty писал(а):
09.06.2012 20:03
1. ну тут я не знаю. Я-бы написал возможно head | sed s///, так ИМХО проще и понятнее. Что до q10, то не надо мне тут было рассказывать, что sed такого не умеет, это не вам было сказано.
2. вопрос привычки. Речь ведь про cat, она тут лишняя по любому, ВНЕЗАПНО head тоже умеет имена файлов.
3. неправильно полагаете, sed просматривает файл 1 раз, и у неё нет подключения к libastral.so, что-бы догадаться, что _через_ 10 строк будет EOF (может вы там ручками набиваете строки?). Потому приходится применять дополнительный буфер, как и в tail.

Только в tail его не надо писать самому. А 1,$-5d — это vim’оподобная команда. Vim такое жрёт, потому что сначала читает весь файл, попутно разбивая на строчки, и только потом позволяет делать с ним что‐то полезное. Другое дело, что засунуть буфер в sed и использовать его когда кто‐то желает иметь нумерацию «с конца» не является невозможной задачей.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

t.t писал(а):
09.06.2012 20:47
Правильно подсказывает. Я, к примеру, пишу -- именно в тех случаях, в которых команда ведёт себя по-разному с указанием имён файлов и без него. Потому что, к примеру, от той же grep или, скажем, wc мне далеко не всегда нужна по-файловая статистика, часто я их запускаю только ради общего результата.

и я тоже так делаю (:
Но в данном конкретном случае разницы таки никакой нет. Как и в _большинстве_ случаев.
t.t писал(а):
09.06.2012 20:59
Значит у нас с Вами разная лень. (: Мне обычно не лень поставить пакет, который не раз мне сэкономит время.

ну про этот пакет знаю, но знаю так же и то, что жизнь мне он не облегчит, ибо мне не попадалось случаев, когда мне этот пакет сэкономит время. Мне удобнее составить конвейер из 3х знакомых команд, чем искать в манах, умеет такое ваш пакет, а если умеет, то как. Он у меня раньше был, убился вместе с HDD.
t.t писал(а):
09.06.2012 20:59
Вы ведь, наверное, догадываетесь, за что многие sed не любят. Скрипт из shell-овских команд это самодокументированный код. А когда я, скажем, нашёл пару своих же скриптов на sed, но написанных больше года назад и без комментариев, полчаса потратил, чтобы понять, что именно они делают.

при всём уважении: ССЗБ
писать код на ЯП, которым вы редко пользуетесь, да ещё и без комментариев...
Конец немного предсказуем...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [Решено] Переменная в аргументах редактора sed

Сообщение drBatty »

t.t писал(а):
09.06.2012 21:05
Об этом и я расскажу. Потому что разработчики Debian правильно понимают принцип "do one thing and do it well". Распаковывать это не задача команды less.

это называется "доведение до абсурда". В таком случае tar тоже не должна ничего сжимать/разжимать, а исключительно паковать. ИМХО вполне логично хранить текстовые файлы в сжатом виде, и я не вижу никаких причин, почему я этого не могу делать? Но если я некоторые файлы храню в сжатом виде, то почему-же я не могу их просматривать имеющейся программой просмотра? "do it well" тут не работает.
t.t писал(а):
09.06.2012 21:05
Потому что если я не сказал явно, что мне нужна распаковка, то программа не имеет права за меня об этом "догадываться".

IRL довольно многие программы "догадываются", и в этом нет ничего плохого. Ну вот как пример - gpg. Или всеми любимый vim, который не только распаковывает, но ещё и у многих кодировку подбирает, а у иных даже chmod +x на файлах с sha-bang'ом делает (это уже ИМХО перебор).
ZyX писал(а):
09.06.2012 21:12
Вы сказали, что она делает это построчно. Это не так.

насколько я помню, она читает поток какой-то из функций вроде fgets(3), причём там внутренняя буферизация, но читает таки построчно, но ессно не прямо из файла, а из внутреннего буфера. Впрочем, за 5 лет это могло изменится, да и я могу ошибаться, и читает она построчно лишь при нумерации строк. Посмотрите, если вам не лениво...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [Решено] Переменная в аргументах редактора sed

Сообщение t.t »

drBatty писал(а):
09.06.2012 21:14
t.t писал(а):
09.06.2012 20:59
Вы ведь, наверное, догадываетесь, за что многие sed не любят. Скрипт из shell-овских команд это самодокументированный код. А когда я, скажем, нашёл пару своих же скриптов на sed, но написанных больше года назад и без комментариев, полчаса потратил, чтобы понять, что именно они делают.
при всём уважении: ССЗБ
писать код на ЯП, которым вы редко пользуетесь, да ещё и без комментариев...
Конец немного предсказуем...
Не надо уходить от темы. Начнём с того, что _тогда_ я пользовался sed часто, иначе бы на нём этого и не писал. Но речь ведь была о том, что в shell-скриптах десятилетней давности мне комментарии _не нужны_. Или, другими словами, сам код их и заменяет. А писать на sed такой код, который читается без комментариев, _невозможно_.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [Решено] Переменная в аргументах редактора sed

Сообщение t.t »

drBatty писал(а):
09.06.2012 21:28
t.t писал(а):
09.06.2012 21:05
Об этом и я расскажу. Потому что разработчики Debian правильно понимают принцип "do one thing and do it well". Распаковывать это не задача команды less.
это называется "доведение до абсурда". В таком случае tar тоже не должна ничего сжимать/разжимать, а исключительно паковать. ИМХО вполне логично хранить текстовые файлы в сжатом виде, и я не вижу никаких причин, почему я этого не могу делать? Но если я некоторые файлы храню в сжатом виде, то почему-же я не могу их просматривать имеющейся программой просмотра? "do it well" тут не работает.
Ещё как работает. Ведь tar сам по себе ничего и не разжимает, ему это нужно специальным ключиком указывать. Т.е. и tar xf, и tar xzf работает одинаково _всегда_. Поэтому less, "догадывающаяся" о типе файла и эмулирующая zless, когда ей этого не говорили, -- это неправильно.

drBatty писал(а):
09.06.2012 21:28
t.t писал(а):
09.06.2012 21:05
Потому что если я не сказал явно, что мне нужна распаковка, то программа не имеет права за меня об этом "догадываться".
IRL довольно многие программы "догадываются", и в этом нет ничего плохого. Ну вот как пример - gpg. Или всеми любимый vim, который не только распаковывает, но ещё и у многих кодировку подбирает, а у иных даже chmod +x на файлах с sha-bang'ом делает (это уже ИМХО перебор).
Vim это интерактивная программа, ему можно. Его поведение не столько командной строкой, сколько конфигом настраивается. Если конфиг пуст, он, вполне возможно, ничего такого и не сделает (про vim не уверен, emacs точно не сделает). GPG изначально заточена под конкретный тип файлов, поэтому ей не то чтобы можно, но простительно. А less должна жрать что дают и без приказа ничего не трогать.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Ответить