2013-03-03 11 views
8

Próbuję zastąpić wyrażenie za pomocą sed. Regex działa w vimie, ale nie w sed. Ja zastępując ostatnią kreskę przed numerem z ukośnikiem takBackreferences w sed zwrotnie złą wartość

/www/file-name-1 

powinien powrócić

/www/file-name/1 

Używam następujące polecenie, ale utrzymuje wyprowadzania/www/file-name/0 zamiast

sed 's/-[0-9]/\/\0/g' input.txt 

Co robię źle?

Odpowiedz

15

Musisz otoczyć nawiasie dane odwołać go później, a sed zaczyna się liczyć w 1. Aby odzyskać wszystkie znaki dopasowany bez potrzeby nawiasów, używany jest symbol &.

sed 's/-\([0-9]\)/\/\1/g' input.txt 

że plony:

/www/file-name/1 
+0

To jest poprawna odpowiedź. Nie zauważyłem, że @ user2052491 nie używał nawiasów. – maljub01

+0

backslashes przed nawiasami klamrowymi nie są konieczne, czyż nie? – Blauhirn

0

Wydaje sed pod OS X rozpoczyna odliczanie wsteczne w 1.Spróbuj \1 zamiast \0

+0

jeśli użyję \ 1 to zwróci "\ 1 nie zdefiniowane w RE" – user2052491

+0

OS X/macOS ma starożytny system UNIX. Nie możesz użyć '-r', co oznacza, że ​​musisz uciec z nawiasów. –

+0

OS X używa sed -E zamiast -r, aby włączyć przedłużone wyrażenie regularne – thenickdude

5

Trzeba uchwycić za pomocą nawiasów, zanim będzie można wykonać kopię odwoływać (który rozpoczyna \1). Spróbuj sed -r 's|(.*)-|\1/|':

$ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1" 
/www/file-name/1 

Można użyć dowolnego ogranicznika z sed tak / nie jest najlepszym wyborem, jeśli zastąpienie zawiera /. Opcja -r służy do rozszerzonego wyrażeń regularnych, więc nawias nie wymaga ucieczki.