LINUX.ORG.RU

История изменений

Исправление Kroz, (текущая версия) :

Помогите пожалуйста или посоветуйте толковый ресурс по sed ... Где есть четкое описание синтаксиса . Честно говоря уже голову сломал пытаясь понят абракадабру.

Для простых вещей рекомендую использовать встроенные средства bash: http://www.opennet.ru/docs/RUS/bash_scripting_guide/x4171.html

Описание синтаксис регулярных выражений в доступной форме описано здесь: http://ru.wikipedia.org/wiki/Регулярные_выражения

Но, читая wiki, ты должен помнить, что есть нюансы. Вот два главных их них:

1. Помни, про спец. символы, которые интерпретируются bash, да и самим sed.

Например, вот это не сработает:

$ echo 'This > is \ cool $A' | sed s/>/X/g
, так как '>' - управляющий символ bash. А вот эти три сработают:
$ echo 'This > is \ cool $A' | sed s/\>/X/g
$ echo 'This > is \ cool $A' | sed "s/>/X/g"
$ echo 'This > is \ cool $A' | sed 's/>/X/g'

Кое-что интерпретируется в двойных кавычках. Вот это не сработает:

$ echo 'This > is \ cool $a' | sed "s/$a/X/g"
а нужно вот так:
$ echo 'This > is \ cool $a' | sed "s/\$a/X/g"
$ echo 'This > is \ cool $a' | sed 's/$a/X/g'

Еще интересней с обратной чертой, которая интерпретируется как bash, так и sed. Не работает:

$ echo 'This > is \ cool $A' | sed s/\/X/g
$ echo 'This > is \ cool $A' | sed s/\\/X/g
$ echo 'This > is \ cool $A' | sed "s/\\/X/g"
$ echo 'This > is \ cool $A' | sed 's/\/X/g'
Работает:
$ echo 'This > is \ cool $A' | sed "s/\\\\/X/g"
$ echo 'This > is \ cool $A' | sed 's/\\/X/g'

Рекомендации как уберечься от ошибок:
1) старайся заключать регулярные выражения в одинарные кавычки (кроме случаев, когда ты знаешь, что тебе нужно другое)
2) если регулярное выражение не работает - экспериментируй с экранированием.

2. Помни про разные подвиды синтаксиса регулярных выражений: perl, POSIX и т. п.; в принципе, в wiki в конце это написано.

Например, из wiki у тебя вот так не получится:

$ echo 'Number 9' | sed 's/\d/X/g'
Зато получится вот так:

$ echo 'Number 9' | sed 's/[0-9]/X/g'
$ echo 'Number 9' | sed 's/[[:digit:]]/X/g'

Для примера, в grep можно переключать режимы; сравни вывод этих двух команд:

echo 'Number 9' | grep '\d'
echo 'Number 9' | grep -P '\d'

Рекомендации как уберечься от ошибок: аккуратно использовать символьные классы и всякие фигурные скобки.

В остальном читай wiki и пробуй.

Hope this helps.

Исходная версия Kroz, :

Помогите пожалуйста или посоветуйте толковый ресурс по sed ... Где есть четкое описание синтаксиса . Честно говоря уже голову сломал пытаясь понят абракадабру.

Для простых вещей рекомендую использовать встроенные средства bash: http://www.opennet.ru/docs/RUS/bash_scripting_guide/x4171.html

Описание синтаксис регулярных выражений в доступной форме описано здесь: http://ru.wikipedia.org/wiki/Регулярные_выражения

Но, читая wiki, ты должен помнить, что есть нюансы. Вот два главных их них:

1. Помни, про спец. символы, которые интерпретируются bash, да и самим sed.

Например, вот это не сработает:

$ echo 'This > is \ cool $A' | sed s/>/X/g
, так как '>' - управляющий символ bash. А вот эти три сработают:
$ echo 'This > is \ cool $A' | sed s/\>/X/g
$ echo 'This > is \ cool $A' | sed "s/>/X/g"
$ echo 'This > is \ cool $A' | sed 's/>/X/g'

Кое-что интерпретируется в двойных кавычках. Вот это не сработает:

$ echo 'This > is \ cool $a' | sed "s/$a/X/g"
а нужно вот так:
$ echo 'This > is \ cool $a' | sed "s/\$a/X/g"
$ echo 'This > is \ cool $a' | sed 's/\$a/X/g'

Еще интересней с обратной чертой, которая интерпретируется как bash, так и sed. Не работает:

$ echo 'This > is \ cool $A' | sed s/\/X/g
$ echo 'This > is \ cool $A' | sed s/\\/X/g
$ echo 'This > is \ cool $A' | sed "s/\\/X/g"
$ echo 'This > is \ cool $A' | sed 's/\/X/g'
Работает:
$ echo 'This > is \ cool $A' | sed "s/\\\\/X/g"
$ echo 'This > is \ cool $A' | sed 's/\\/X/g'

Рекомендации как уберечься от ошибок:
1) старайся заключать регулярные выражения в одинарные кавычки (кроме случаев, когда ты знаешь, что тебе нужно другое)
2) если регулярное выражение не работает - экспериментируй с экранированием.

2. Помни про разные подвиды синтаксиса регулярных выражений: perl, POSIX и т. п.; в принципе, в wiki в конце это написано.

Например, из wiki у тебя вот так не получится:

$ echo 'Number 9' | sed 's/\d/X/g'
Зато получится вот так:

$ echo 'Number 9' | sed 's/[0-9]/X/g'
$ echo 'Number 9' | sed 's/[[:digit:]]/X/g'

Для примера, в grep можно переключать режимы; сравни вывод этих двух команд:

echo 'Number 9' | grep '\d'
echo 'Number 9' | grep -P '\d'

Рекомендации как уберечься от ошибок: аккуратно использовать символьные классы и всякие фигурные скобки.

В остальном читай wiki и пробуй.

Hope this helps.