sed
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 5
sed
Начал изучать команду sed, и делать на неё разные упражнения. И столкнулся с таким:
Найти нужно слово в строке, удалить эту строку и записать туда текст.
Отлично.
делаю: sed '/заменяемое/ c\ cтрока замены'
Работать не хочет, хотя в документации так и написано
Найти нужно слово в строке, удалить эту строку и записать туда текст.
Отлично.
делаю: sed '/заменяемое/ c\ cтрока замены'
Работать не хочет, хотя в документации так и написано
-
- Модератор
- Сообщения: 4823
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: sed
можно еще так: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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
- Администратор
- Сообщения: 5405
- ОС: Gentoo
Re: sed
SubaroMows писал(а): ↑16.11.2010 22:04делаю: sed '/заменяемое/ c\ cтрока замены'
Работать не хочет, хотя в документации так и написано
Всё прекрасно работает. Покажите конкретный пример, который у вас не выходит.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed
SubaroMows писал(а): ↑16.11.2010 22:04делаю: sed '/заменяемое/ c\ cтрока замены'
Работать не хочет, хотя в документации так и написано
это не совсем то. c используется для подавления вывода буфера, и вывод вместо неё строки.
для замена используйте s
Код: Выделить всё
sed 's/заменяемое_сово/слово для замены/g'
интересно, а это-ли нужно? ИМХО ТС просто не дошёл пока до буквы s :)
sed '/word/s/.*/new_string'
-
- Сообщения: 5
Re: sed
Спс всем, как и первое так и второе работает. s - я действительно не знал.
Кстати в некоторых примерах видел как / заменяю на ; . В чём отличие? или одинаковое значение.
Кстати в некоторых примерах видел как / заменяю на ; . В чём отличие? или одинаковое значение.
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed
это вы про команду s?
её формат:
sXрегэксп1Xрегексп2Xключи
X — может быть любым символом (но все три раза в одной команде, естественно, одним и тем же).
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 5
Re: sed
А скажите ещё
sed OPTIONS... [SCRIPT] [INPUTFILE...]
Я так понимаю можно указать несколько файлов что бы они обрабатывались sed?
К примеру sed [SCRIPT] file1 file2 ... fileN
Хорошо если файлов 1 или 2,а если их 100? Допустим мне нужно в директории просмотреть все файлы и применить к ним мой SCRIPT.
Пробывал ls | sed [SCRIPT], не получается, зато ручками sed [SCRIPT] file1 file2 ... fileN получается. В чём подвох? или я не правильно понял как использовать |
sed OPTIONS... [SCRIPT] [INPUTFILE...]
Я так понимаю можно указать несколько файлов что бы они обрабатывались sed?
К примеру sed [SCRIPT] file1 file2 ... fileN
Хорошо если файлов 1 или 2,а если их 100? Допустим мне нужно в директории просмотреть все файлы и применить к ним мой SCRIPT.
Пробывал ls | sed [SCRIPT], не получается, зато ручками sed [SCRIPT] file1 file2 ... fileN получается. В чём подвох? или я не правильно понял как использовать |
-
- Модератор
- Сообщения: 4823
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: sed
Подвох в том, что не обязательно перечислять руками все файлы, можно задать маску. Этот вопрос относится не к sed, а к bash и принципам работы в нем. Работать будет любой из следующих вариантов:
Код: Выделить всё
sed 's/.././' file*
ls | xargs sed 's/.././'
for i in *; do sed -i 's/.././' $i; done
Это сделано для удобства. Например вам нужно заменить пути в файл с /etc/fail на /etc/success и чтобы не экранировать все слеши в именах:SubaroMows писал(а): ↑17.11.2010 18:15Ну вот пример
sed -n 's;";&;p'
sed -n 's/"/&/p'
Результат один и тот же
Код: Выделить всё
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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed
не всё так просто:
$
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'
Спасибо сказали:
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed
совершенно верно. с точки зрения sed-а это абсолютно идентичные конструкции. соответственно, и результат у них один и тот же.SubaroMows писал(а): ↑17.11.2010 18:15
Ну вот пример
sed -n 's;";&;p'
sed -n 's/"/&/p'
Результат один и тот же
p.s. забыл упомянуть маленький момент: X — это разделитель регэкспов. соответственно, он не должен встречаться ни внутри регэксп1, ни внутри регэксп2, либо, если встречается, должен быть заэкранирован обратным слэшем.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed
а ещё там не может быть 'кавычек'.
причём экранировать кавычку невозможно, её можно заменить на \x27
а ещё, в csh кавычки по другому работают.
а ещё, sed-скрипт можно записать в файл, тогда там можно кавычки писать.
Спасибо сказали:
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed
может. если не работает, это уже вопрос к шеллу, а не к sed-у.
$ echo 1 | sed "s/1/'2'/"
'2'
зачем экранировать, если её можно передать as is? ну, если очень хочется, можно, конечно, добавить backslash. суть (в данном случае) не изменится:QUOTE писал(а):причём экранировать кавычку невозможно
$ echo 1 | sed "s/1/\'2\'/"
'2'
опять-таки, sed тут при чём?QUOTE писал(а):а ещё, в csh кавычки по другому работают.
вот именно. отвязаться от шелл-специфики.QUOTE писал(а):а ещё, sed-скрипт можно записать в файл, тогда там можно кавычки писать.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог