История изменений
Исправление 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
$ 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
$ 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.