批量处理URL列表:用Unix工具仅删除查询参数或片段部分
解决方案
功能1:批量删除URL中的查询参数部分
使用sed工具,通过正则匹配并删除?到最近的#或行尾的内容,命令如下:
sed 's/\?[^#]*//' input_urls.txt > output_no_query.txt
或者通过管道处理:
cat input_urls.txt | sed 's/\?[^#]*//' > output_no_query.txt
正则说明:
\?:匹配URL中的查询参数起始符?(转义是因为?在正则中有特殊含义)[^#]*:匹配任意数量的非#字符,直到遇到#或行尾- 整个替换操作会把
?及其后的查询参数(如果没有#则到行尾)替换为空,保留#及之后的片段部分。
功能2:批量删除URL中的片段部分
同样使用sed,匹配并删除#到最近的?或行尾的内容,命令如下:
sed 's/#[^?]*//' input_urls.txt > output_no_fragment.txt
或者管道处理:
cat input_urls.txt | sed 's/#[^?]*//' > output_no_fragment.txt
正则说明:
#:匹配URL中的片段起始符#[^?]*:匹配任意数量的非?字符,直到遇到?或行尾- 替换操作会把
#及其后的片段内容(如果没有?则到行尾)替换为空,保留?及之后的查询参数部分。
验证测试
针对你提供的测试URL列表:
原始URL:
http://test0.com/a.exe http://test1.com/a.exe?p=123 http://test2.com/a.exe#fragment http://test3.com/a.exe?p=123#fragment http://test3.com/a.exe#fragment?p=123
- 功能1执行后结果完全符合预期:
http://test0.com/a.exe http://test1.com/a.exe http://test2.com/a.exe#fragment http://test3.com/a.exe#fragment http://test3.com/a.exe#fragment - 功能2执行后结果也完全符合预期:
http://test0.com/a.exe http://test1.com/a.exe?p=123 http://test2.com/a.exe http://test3.com/a.exe?p=123 http://test3.com/a.exe?p=123
优势说明
sed是Unix/Linux系统的标准工具,采用流式处理模式,不需要加载整个文件到内存,处理上万条甚至更多条目时效率极高,完全满足你的管道处理需求,无需编写C程序。
内容的提问来源于stack exchange,提问作者ralf9000
相关产品推荐
相关产品推荐

