2016-12-17 110 views
2

我想从以下txt文件我想用sed命令

$ cat sample 
user_id=1234 /battle/start 

我运行下面的sed命令

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

但提取/battle/result提取特定的字符,结果被删除/battle,所以我无法按照我的意愿提取它。

它有什么问题?

+0

有你坚持使用'sed'任何理由? 'cut'和'awk'更适合这个任务。 –

+0

但是这个样本可以通过使用cut或awk来提取,实际上我想从nginx的访问日志中提取 –

回答

0

Sed试图做一个贪婪的(最大)匹配,因此.*匹配您的整个行,但不包括第二个/

尝试:

< 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