我有包含服务器 URL 行的文本文件,例如:
request get https://abc.net/search?q=hello/world/hello/word/search=5&size=10
request get https://abc.net/search?q=hello/world/hello/world/hello/word=5
在此文本文件中,我希望将“search?q=”字符串后面的文本存储在另一个文件输出文件中:
hello/world/hello/word/search=5&size=10
hello/world/hello/word/hello/world=5
hello1world1/hello/world/hello/word
答案1
sed -n '/search?q=/{s/.*search?q=//;p;}' infile > outfile
解释:
/search?q=/
使以下命令集(在花括号中)仅适用于包含此正则表达式的行。
s/.*search?q=//
用第二部分(空)替换第一部分。
然后p
打印该行。
该-n
标志禁止默认打印该行。
实际上,你可以像这样简化:
sed -n '/.*search?q=/{s///;p;}' infile > outfile
因为当输入到命令的模式s/
留空时,将再次使用上次使用的模式。
编辑:感谢 RobertL 在评论中指出了简化:
sed -n 's/.*search?q=//p' infile > outfile
这使用命令p
的标志s
,仅在进行替换时打印出该行。
答案2
如果你的 grep 版本支持 PCRE,你可以使用类似的东西
grep -oP 'search\?q=\K.*' infile > outfile
答案3
通过使用 Lookbehind 基于 Perl 的正则表达式搜索,我们可以获得您所需的结果。
grep -oP '(?<=search\?q\=)[^ ]*' *filename*
请记住添加\
before?
和=
因为它们是lookbehind 正则表达式的一部分。