在每行中搜索特定单词并打印该行的其余部分

在每行中搜索特定单词并打印该行的其余部分

我有包含服务器 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 正则表达式的一部分。

相关内容