Ошибка в сценарии sed - дополнительные символы после команды - PullRequest
0 голосов
/ 30 сентября 2018

Я пытался создать сценарий sed, который читает список телефонных номеров и печатает только те из них, которые соответствуют следующим схемам:

  • + 1 (212) xxx-xxxx
  • 1 (212) xxx-xxxx

Я абсолютный новичок, но я попытался написать сценарий sed , который напечатал бы это для меня, используя -n -r flags (содержимое которых выглядит следующим образом):

/\+1\(212\)[0-9]{3}-[0-9]{4}/p
/1\(212\)[0-9]{3}-[0-9]{4}/p

Если я запускаю это непосредственно в sed, он работает нормально (т.е. sed -n -r '/\+1\(212\)[0-9]{3}-[0-9]{4}/p' sample.txt печатает совпадающие строки, как и ожидалось. Это не работает в sedСценарий, который я написал, вместо этого sed говорит:

sed: -e выражение # 1, char 2: дополнительные символы после команды

Я не смог найти хорошее решение, этоОшибка, кажется, имеет так много причин, и ни один из найденных ответов не может быть применен здесь легко.

РЕДАКТИРОВАТЬ: Я запустил ее с sed -n -r script.sed sample.txt

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Из различных инструментов Unix два используют BRE в качестве диалекта регулярных выражений по умолчанию.Этими двумя инструментами являются sed и grep.

. В большинстве операционных систем вы можете использовать egrep или grep -E, чтобы указать этому инструменту использовать ERE в качестве своего диалекта.Меньшее (но все же значительное) число реализаций sed примет опцию -E для использования ERE.

В режиме BRE, однако, вы все равно можете создавать атомы в скобках.И вы делаете это, избегая скобок.Вот почему ваше первоначальное выражение терпит неудачу - круглые скобки по умолчанию НЕ являются специальными в BRE, но вы делаете их особенными, поставив перед символами обратную косую черту.

Также следует помнить, что если вы хотите, чтобы sed выполнял скрипт из аргумента командной строки, вы должны использовать опцию -e.

Итак:

$ cat ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx
212-xxx-xxxx

$ grep '^+\{0,1\}1([0-9]\{3\})' ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx

$ egrep '^[+]?1\([0-9]{3}\)' ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx

$ sed -n -e '/^+\{0,1\}1([0-9]\{3\})/p' ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx

$ sed -E -n -e '/^[+]?1\([0-9]{3}\)/p' ph.txt
+1(212)xxx-xxxx
1(212)xxx-xxxx

В зависимости от вашей ОС, вы можете получить полный список того, как это работает, с man re_format.

0 голосов
/ 30 сентября 2018

sed не может автоматически определить, предполагаете ли вы, что параметр является файлом сценария или строкой сценария.

Чтобы запустить скрипт sed из файла, вы должны использовать -f:

$ echo 's/hello/goodbye/g' > demo.sed

$ echo "hello world" | sed -f demo.sed
goodbye world

Если вы пренебрегаете -f, sed попытается запустить имя файла каккоманда, и команда d elete не рада иметь emo.sed после нее:

$ echo "hello world" | sed demo.sed
sed: -e expression #1, char 2: extra characters after command
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...