Sed не распознает подходящую группу - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь распечатать подстроку из всех файлов PDF в каталоге.Я не могу заставить Sed работать с этим.Регулярное выражение верно, но sed выдает ошибку, когда я использую \ 1

for old in ./*.pdf; do
    new=$(echo $old | sed -e 's/(\.\/)?\d+_(\w\w\-\d+).+/\1/')
    echo $new
done

Я использую sed (GNU sed) 4.4

Вывод:

sed: -e выражение # 1, символ 32: недопустимая ссылка \ 1 в RHS команды `s '

для каждого файла в каталоге ...

Спасибо!

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете использовать

sed -E 's/(\.\/)?[0-9]+_[A-Z][A-Z]-[0-9]+.+/\1/'

Обратите внимание, что sed не поддерживает регулярное выражение PCRE, поэтому \d и \w являются просто недопустимыми конструкциями здесь.Чтобы сопоставить любую букву, вы можете использовать [:alpha:] класс символов POSIX, или, если вы хотите сопоставить заглавные буквы, используйте [:upper:].

Вместо \d, используйте [0-9] или [:digit:].

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

То же самое относится к + квантификатору: в паттерне POSIX BRE он должен экранироваться, в паттерне ERE можно использовать его без экранирования.

Кроме того, вам не нужно использоватьвторая группа захвата, поскольку вы не используете \2 в качестве замены.

...