我想从以下txt文件我想用sed命令
$ cat sample
user_id=1234 /battle/start
我运行下面的sed命令
$ cat sample | sed 's|.*\(/.*\)|\1|g'
/start
但提取/battle/result
提取特定的字符,结果被删除/battle
,所以我无法按照我的意愿提取它。
它有什么问题?
我想从以下txt文件我想用sed命令
$ cat sample
user_id=1234 /battle/start
我运行下面的sed命令
$ cat sample | sed 's|.*\(/.*\)|\1|g'
/start
但提取/battle/result
提取特定的字符,结果被删除/battle
,所以我无法按照我的意愿提取它。
它有什么问题?
Sed试图做一个贪婪的(最大)匹配,因此.*
匹配您的整个行,但不包括第二个/
。
尝试:
< sample sed 's|.* \(/.*\)|\1|g'
或
< sample sed 's|[^/]*\(/.*\)|\1|g'
在您的RE *为贪婪吞噬/battle
部分,你可以尝试反转逻辑和删除的/
面前的一切:
cat sample | sed 's/[^/]*//'
这里[^/]*
比赛这不是/
并且没有任何东西取而代之。
可以删除所有字符去年空间:
$ sed 's/.* //' <<< "user_id=1234 /battle/start"
/battle/start
或使用cut
:
$ cut -d' ' -f2 <<< "user_id=1234 /battle/start"
/battle/start
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
有你坚持使用'sed'任何理由? 'cut'和'awk'更适合这个任务。 –
但是这个样本可以通过使用cut或awk来提取,实际上我想从nginx的访问日志中提取 –