2016-12-17 3 views
2

Я хочу, чтобы извлечь /battle/result из после текстового файлаЯ хочу, чтобы извлечь конкретный символ, используя патч в команду

$ cat sample 
user_id=1234 /battle/start 

бегаю после SED команды

$ cat sample | sed 's|.*\(/.*\)|\1|g' 
/start 

Но результат удаления /battle, поэтому я не могу извлечь его, как хочу.

Что не так?

+0

Есть ли какой-либо причине вы настаиваете на использовании 'sed'? 'cut' и' awk' больше подходят для этой задачи. –

+0

Однако этот пример можно извлечь с помощью cut или awk, на самом деле я хочу извлечь из журнала доступа для nginx –

ответ

0

Sed пытается сделать жадное (максимальное) совпадение, поэтому .* соответствует всей вашей линии до, но не включая второй /.

Try:.

< sample sed 's|.* \(/.*\)|\1|g' 

или

< sample sed 's|[^/]*\(/.*\)|\1|g' 
0

В вашем RE на * жаден и проглатывает /battle часть, вы могли бы попытаться перевернуть логику и удалить все перед /:

cat sample | sed 's/[^/]*//' 

Здесь [^/]* совпадения все, что не является / и заменяет его ничем.

1

Вы можете удалить все символы до последнего пространства:

$ sed 's/.* //' <<< "user_id=1234 /battle/start" 
/battle/start 

или использовать cut:

$ cut -d' ' -f2 <<< "user_id=1234 /battle/start" 
/battle/start 
0
echo user_id=1234 /battle/start |grep -oP '\s\K.*' 
/battle/start 

echo user_id=1234 /battle/start |sed -r 's/(^.*\s)(.*)/\2/g' 
/battle/start 
Смежные вопросы