2016-12-17 156 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