2017-02-16 14 views
2

Я пытаюсь получить полные имена файлов с расширением (abc.jpg), используя sed.Замена заместителя регулярного выражения с обратной речью Почему не работает?

input.txt:

sfdb/asdjfj/abc.jpg 
asdfj/asdfj/abd.gif 
sfdb/asdjfj/abc.jpg 
sfdb/asdjfj/abc-2.jpg 
asdfjk/asdjf/asdf_?/sfdb/asdjfj/abc_12.jpg 
asdfj/asdfj/abdasdfj 

текущая команда:

grep ".jpg" input.txt|sed 's:/\([^/]+\.jpg\):\1:gi' 

Grep это просто пример для получения указанных линий (хотя и не нужна). Я уже проверил мой регулярное выражение, чтобы получить только последний '/' + имя файла + .jpg: https://www.regex101.com/r/5GTgak/2

Ожидаемый выход:

abc.jpg 
abc.jpg 
abc-2.jpg 
abc_12.jpg 

Но я все еще получаю один и тот же входной файл. Что я делаю не так?

+1

Попробуйте 'sed 's:. */\ ([^ /] + \. Jpg \): \ 1: gi'' –

+0

Вы снова, вы ищете только вопросы регулярного выражения, ( –

+0

@ WiktorStribiżew все еще не работает , regex должно быть в порядке: https://www.regex101.com/r/5GTgak/2 – jack

ответ

1

Используйте следующую команду:

sed -rn 's/^.*\/([^/]+\.jpg)$/\1/gp' input.txt 

-r опция позволяет расширенные регулярные выражения

/g - применить замену всех матчей в регулярном выражении, а не только первый.

/p - если была сделана замена, напечатайте новое пространство для рисунка.

+0

может использовать' s | ^. */([^ /] + \. jpg) $ | \ 1 | gp', чтобы избежать экранирования '/' ... также, sed не поддерживает неживое регулярное выражение – Sundeep

+0

@Sundeep, да, это было * perl * привычки, удалены * -gready * stuff – RomanPerekhrest

+1

понятный;) также, '[^ /]' может быть заменен на '[^.]', поскольку все '/' уже используются – Sundeep