sed

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

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

SubaroMows
Сообщения: 5

sed

Сообщение SubaroMows »

Начал изучать команду sed, и делать на неё разные упражнения. И столкнулся с таким:
Найти нужно слово в строке, удалить эту строку и записать туда текст.
Отлично.
делаю: sed '/заменяемое/ c\ cтрока замены'

Работать не хочет, хотя в документации так и написано
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: sed

Сообщение SLEDopit »

SubaroMows писал(а):
16.11.2010 22:04
Найти нужно слово в строке, удалить эту строку и записать туда текст.
Отлично.
делаю: sed '/заменяемое/ c\ cтрока замены'
можно еще так:

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

sed 's/.*word.*/new string/' file
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: sed

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

SubaroMows писал(а):
16.11.2010 22:04
делаю: sed '/заменяемое/ c\ cтрока замены'

Работать не хочет, хотя в документации так и написано

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

Re: sed

Сообщение drBatty »

SubaroMows писал(а):
16.11.2010 22:04
делаю: sed '/заменяемое/ c\ cтрока замены'

Работать не хочет, хотя в документации так и написано

это не совсем то. c используется для подавления вывода буфера, и вывод вместо неё строки.
для замена используйте s

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

sed 's/заменяемое_сово/слово для замены/g'


SLEDopit писал(а):
16.11.2010 22:11
sed 's/.*word.*/new string/' file

интересно, а это-ли нужно? ИМХО ТС просто не дошёл пока до буквы s :)
sed '/word/s/.*/new_string'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
SubaroMows
Сообщения: 5

Re: sed

Сообщение SubaroMows »

Спс всем, как и первое так и второе работает. s - я действительно не знал.
Кстати в некоторых примерах видел как / заменяю на ; . В чём отличие? или одинаковое значение.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: sed

Сообщение sash-kan »

SubaroMows писал(а):
17.11.2010 16:16
Кстати в некоторых примерах видел как / заменяю на ;
это вы про команду s?
её формат:
sXрегэксп1Xрегексп2Xключи
X — может быть любым символом (но все три раза в одной команде, естественно, одним и тем же).
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
SubaroMows
Сообщения: 5

Re: sed

Сообщение SubaroMows »

А скажите ещё
sed OPTIONS... [SCRIPT] [INPUTFILE...]
Я так понимаю можно указать несколько файлов что бы они обрабатывались sed?
К примеру sed [SCRIPT] file1 file2 ... fileN
Хорошо если файлов 1 или 2,а если их 100? Допустим мне нужно в директории просмотреть все файлы и применить к ним мой SCRIPT.
Пробывал ls | sed [SCRIPT], не получается, зато ручками sed [SCRIPT] file1 file2 ... fileN получается. В чём подвох? или я не правильно понял как использовать |
Спасибо сказали:
SubaroMows
Сообщения: 5

Re: sed

Сообщение SubaroMows »

sash-kan писал(а):
17.11.2010 17:58
SubaroMows писал(а):
17.11.2010 16:16
Кстати в некоторых примерах видел как / заменяю на ;
это вы про команду s?
её формат:
sXрегэксп1Xрегексп2Xключи
X — может быть любым символом (но все три раза в одной команде, естественно, одинм и тем же).

Ну вот пример
sed -n 's;";&;p'
sed -n 's/"/&/p'
Результат один и тот же
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: sed

Сообщение SLEDopit »

SubaroMows писал(а):
17.11.2010 18:08
В чём подвох?
Подвох в том, что не обязательно перечислять руками все файлы, можно задать маску. Этот вопрос относится не к sed, а к bash и принципам работы в нем. Работать будет любой из следующих вариантов:

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

sed 's/.././' file*
ls | xargs sed 's/.././'
for i in *; do sed -i 's/.././' $i; done
SubaroMows писал(а):
17.11.2010 18:15
Ну вот пример
sed -n 's;";&;p'
sed -n 's/"/&/p'
Результат один и тот же
Это сделано для удобства. Например вам нужно заменить пути в файл с /etc/fail на /etc/success и чтобы не экранировать все слеши в именах:

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

sed 's/\/etc\/fail/\/etc\/success/' file
вы просто меняет разделитель с / на любой другой

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

sed 's=/etc/fail=/etc/success=' file
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
SubaroMows
Сообщения: 5

Re: sed

Сообщение SubaroMows »

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

Re: sed

Сообщение drBatty »

SLEDopit писал(а):
17.11.2010 18:24
Этот вопрос относится не к sed, а к bash

не всё так просто:

$

doc@bx:~/tests$ echo 1 >f1 doc@bx:~/tests$ echo 2 >f2 doc@bx:~/tests$ sed '$s/.*/последняя строка "&"/' f* 1 последняя строка "2" doc@bx:~/tests$ sed -s '$s/.*/последняя строка "&"/' f* последняя строка "1" последняя строка "2"


Т.о., sed по умолчанию работает как cat - она сливает все файлы в 1 большой
Что-бы этого избежать существует опция -s, которая по умолчанию включается для опции -i.

ЗЫЖ если при всём при этом начать вводить/выводить в файлы командами w W R r, то вообще дурдом получается :(

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

sed 's/.././' file*
ls | xargs sed 's/.././'
for i in *; do sed -i 's/.././' $i; done

ещё

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

$ ls | sed 's/.*/echo "&" | sed "s~.~..~"/e'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: sed

Сообщение sash-kan »

SubaroMows писал(а):
17.11.2010 18:15
sash-kan писал(а):
17.11.2010 17:58
SubaroMows писал(а):
17.11.2010 16:16
Кстати в некоторых примерах видел как / заменяю на ;
это вы про команду s?
её формат:
sXрегэксп1Xрегексп2Xключи
X — может быть любым символом (но все три раза в одной команде, естественно, одинм и тем же).

Ну вот пример
sed -n 's;";&;p'
sed -n 's/"/&/p'
Результат один и тот же
совершенно верно. с точки зрения sed-а это абсолютно идентичные конструкции. соответственно, и результат у них один и тот же.

p.s. забыл упомянуть маленький момент: X — это разделитель регэкспов. соответственно, он не должен встречаться ни внутри регэксп1, ни внутри регэксп2, либо, если встречается, должен быть заэкранирован обратным слэшем.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sed

Сообщение drBatty »

sash-kan писал(а):
18.11.2010 11:33
он не должен встречаться ни внутри регэксп1, ни внутри регэксп2, либо, если встречается, должен быть заэкранирован обратным слэшем.

а ещё там не может быть 'кавычек'.
причём экранировать кавычку невозможно, её можно заменить на \x27

а ещё, в csh кавычки по другому работают.

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

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: sed

Сообщение sash-kan »

drBatty писал(а):
18.11.2010 12:13
а ещё там не может быть 'кавычек'.
может. если не работает, это уже вопрос к шеллу, а не к sed-у.
$ echo 1 | sed "s/1/'2'/"
'2'
QUOTE писал(а):причём экранировать кавычку невозможно
зачем экранировать, если её можно передать as is? ну, если очень хочется, можно, конечно, добавить backslash. суть (в данном случае) не изменится:
$ echo 1 | sed "s/1/\'2\'/"
'2'

QUOTE писал(а):а ещё, в csh кавычки по другому работают.
опять-таки, sed тут при чём?

QUOTE писал(а):а ещё, sed-скрипт можно записать в файл, тогда там можно кавычки писать.
вот именно. отвязаться от шелл-специфики.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: