2013-08-07 2 views
1

У меня есть файл, который содержит вывод s3bin sync в формате следующимСЭД Invalid предшествующее регулярное выражение при попытке использовать захватывая группу по поиску и замене

Sync: s3://my-bin-url/source/000/000/001.jpg -> s3://my-bin-url/400/x/000/000/001.jpg 
Sync: s3://my-bin-url/source/000/000/002.jpg -> s3://my-bin-url/400/x/000/000/002.jpg 
Sync: s3://my-bin-url/source/000/000/003.jpg -> s3://my-bin-url/400/x/000/000/003.jpg 

Я хочу, чтобы в конечном итоге с файлом, содержащим следующий

000/000/001.jpg 
000/000/002.jpg 
000/000/003.jpg 

Я пытаюсь сделать это с помощью sed с помощью следующей команды. Это содержится в сценарии #!/bin/sh, а $2 соответствует абсолютному пути к файлу. Этот файл всегда существует.

sed --in-place --regexp-extended '/.*((?:[0-9]{3}\/){2}[0-9]{3}\.jpg)/\1/gi' $2 

Когда я выполнить сценарий, я получаю следующее сообщение об ошибке

sed: -e expression #1, char 36: Invalid preceding regular expression 

Попытки смотреть на этот вопрос не дали каких-либо полезных ответов до сих пор, только предложения вращаются вокруг обеспечивающих / является (который он есть) и ускользает от {} (который, по-видимому, применяется, если не используется --regexp-extended

ответ

2

Возможно, ваша команда sed отсутствует s команда на звезду т.

Также вы можете использовать разделитель регулярных выражений в регистре и избегать экранирования /.

Это СЭД должно работать:

sed -i -r 's#.*(([0-9]{3}/){2}[0-9]{3}\.jpg)#\1#i' file 
+0

я попытался изменить из '/ 'to' # 'безрезультатно ранее. Это удаление 'g' из'/gi' и добавление предшествующих '' ', которые его исправили. Благодарю. Устанавливается на 's /.* (([0-9] {3} \ /) {2} [0-9] {3} \. Jpg)/\ 1/i' (я знаю, что ваша версия не нужна/escaping, но там вы идете) –

+0

Вы можете поместить 'g' обратно, но это не нужно, так как это sed заменяет только одну строку. И да 'sed -r 's /.* (([0-9] {3} \ /) {2} [0-9] {3} \. Jpg)/\ 1/i' файл' также будет работать , – anubhava

+0

Не очень важно, 'g' действительно работает, как вы говорите. Как раз перед тем, как я разместил это, я добавил в '-r' (чтобы зафиксировать проблему фигурных фигурных скобок), я думаю, я просто не пробовал' s/'с' -r' и т. Д.! –

1

Если вы просто хотите, чтобы извлечь эти имена файлов, но не переписан файл, вы можете использовать Grep:

grep -o '[0-9]\+/[0-9]\+/[0-9]\+\.jpg$' filename 
grep -oP '\d+/\d+/\d+\.jpg$' filename 
+0

Цель состоит в том, чтобы перезаписать файл, я не нуждаюсь в файле unsanitised в этом экземпляре –

Смежные вопросы