如何用sed按链接中的序号排序提取含描述的条目至新文件?
解决方案:结合sed与其他工具实现条目排序
单独使用sed无法完成排序操作(sed仅擅长文本替换、行处理,不具备排序功能),但可以通过sed + sort + 其他工具的组合实现需求,具体步骤如下:
方法1:基于链接路径字段排序(适用于路径固定的场景)
假设原文件名为input.txt,目标输出文件为output.txt,执行以下命令:
sed -n 'N;s/\n/|/p' input.txt | sort -t '/' -k4,4n | sed 's/|/\n/g' > output.txt
命令分解:
合并每组条目为单行:
sed -n 'N;s/\n/|/p' input.txtN:将下一行文本读入当前处理的模式空间,把每组的「文件描述行+链接行」合并成一行s/\n/|/:将换行符替换为|(选择不冲突的分隔符),得到类似文件描述|http://linktofile/33.txt的单行格式-n + p:仅打印处理后的内容
按链接中的数字排序:
sort -t '/' -k4,4n-t '/':以/作为字段分隔符-k4,4n:按第4个字段(即33.txt、11.txt这类文件名)的数值排序(n表示按数字大小而非字符串排序)
恢复原格式并输出:
sed 's/|/\n/g':将分隔符|换回换行符,恢复「文件描述+链接」的两行组格式,最后重定向到目标文件
方法2:提取链接中的数字排序(适用于路径不固定的场景)
如果链接的路径结构不固定(比如路径层级变化),可以用awk精准提取链接中的数字作为排序依据:
sed -n 'N;s/\n/|/p' input.txt | awk -F'|' '{match($2, /[0-9]+/, num); print num[0] "|" $0}' | sort -n | cut -d'|' -f2- | sed 's/|/\n/g' > output.txt
命令分解:
- 合并条目为单行:同方法1的第一步
- 提取数字作为排序键:
awk -F'|' '{match($2, /[0-9]+/, num); print num[0] "|" $0}'-F'|':以|分割字段,$2代表链接部分match($2, /[0-9]+/, num):匹配链接中的连续数字,存入数组num- 输出格式为
数字|文件描述|链接,把数字放在行首作为排序依据
- 按数值排序:
sort -n:按行首的数字大小排序 - 移除排序键并恢复格式:
cut -d'|' -f2-:去掉行首的数字和分隔符,还原为文件描述|链接的单行格式
最后用sed换回换行符,输出到目标文件
内容的提问来源于stack exchange,提问作者diggidre
相关产品推荐
相关产品推荐

