0
Words
0
Characters
0
No spaces
0
Lines
0
Paragraphs
0
Sentences
0 min
Reading time
Lines to sort
Sorted output

行排序:在线按字母顺序排序文本

粘贴列表,选择排序方式,即可完成排序。支持区分/不区分大小写、升序/降序,以及适用于文件名和版本字符串的自然排序。

这个行排序工具是什么

一个免费的浏览器内工具,接收一段文本,按换行符分割,对各行进行排序,并返回结果。无需注册,无需上传,内容不离开您的设备。粘贴、点击、复制。

它相当于在命令行运行 sort,但不必与 LC_COLLATE 纠缠,也不用担心 macOS 提供的是旧版 BSD sort,或者 Windows 根本没有 sort(除非安装了 Git Bash)。三个复选框覆盖了最常用的场景:升序或降序、区分/不区分大小写,以及自然排序(让 file2 排在 file10 之前)。

如果您曾经将一列依赖项粘贴到 package.json 中,却疑惑为什么 npm 在下次安装时重新排序了它们,本工具能精确重现 npm 7+ 的排序方式,让 CI 运行时的 diff 结果为空。

排序的实际工作原理

底层使用浏览器的 Intl.Collator API,提供一个按照 Unicode 排序算法(UTS #10) 定义的方式理解 Unicode 的比较函数,而不是原始的码位比较。实际差异:Intl.Collator 知道 é 应该排在 e 旁边,德语的 ß 在主要级别与 ss 等同,大小写之间的差异仅体现在第三级别。

字典排序和区域感知排序并不相同。纯码位排序(LC_ALL=C sort 的结果)将所有大写字母排在所有小写字母之前,因为 A 是 U+0041,而 a 是 U+0061。使用 Unicode 默认排序规则的排序会将它们交织在一起:A < a < B < b < C。我们默认使用区域感知排序,因为这与用户在 Excel 或 Google Sheets 中点击"A-Z 排序"时的预期一致。勾选区分大小写可回退到码位顺序。

自然排序是第三个维度。启用后,file2.log 会排在 file10.log 之前,因为内嵌的数字会作为数字而非逐字符进行比较。如果您想了解背景知识,维基百科有关于自然排序的详细说明。实现使用 Intl.Collatornumeric: true 选项,与 macOS Finder、Windows 文件资源管理器以及更新版 GNU sort -V 使用的是相同的基础能力。

三步完成行排序

一个输入面板,一个输出面板。完全在本地运行;关闭标签页,您的文本就消失了。

  1. 1

    粘贴您的行内容

    将列表粘贴到编辑器中,每行一个条目。末尾的空行没有关系。CRLF 和 LF 均可处理,输出会统一规范化为 LF。如果您想先看看所有三个选项的效果,点击示例按钮会填充一个小型混合列表。

  2. 2

    选择排序选项

    选择升序降序;如果需要 Apple 排在 banana 之前,勾选区分大小写;当涉及文件名或版本号时,勾选自然排序删除空行会在排序前丢弃空行;删除重复项会合并重复的行。

  3. 3

    复制排序后的结果

    点击排序,结果会出现在输出面板中。使用复制将其放入剪贴板,或使用下载将其保存为 .txt 文件。面板头部的行数计数器会显示输出的行数,当您启用去重时,可以清楚地看到删除了多少重复行。

行排序工具的适用场景

在营销活动发送前对邮件列表排序

市场团队将包含订阅者邮件的 CSV 粘贴到推广工具中,但列表按注册顺序排列。先在这里按字母顺序排序(不区分大小写,因为邮件本地部分实际上不区分大小写),然后去重。在推广工具中导入会更快,而且像 gmial.com 这样的拼写错误的域名一眼就能发现,因为它就排在合法的 gmail.com 旁边。

按字母顺序排列 CSS 类名或 HTML 属性顺序

一些团队要求在 class="..." 属性中按字母顺序排列类名,以保持 PR diff 的整洁。粘贴属性值,排序,再粘贴回去。当 linter 报错时,同样的技巧适用于 HTML 属性顺序,或者在未安装 prettier-plugin-tailwindcss 的仓库中手动排序 Tailwind 工具类。

排序 .gitignore 让未来的 PR diff 更清晰

每个人都往里加内容的 .gitignore 文件会变得杂乱。一次性按字母排序,提交,此后新增的条目会落在显而易见的位置,diff 对审查者来说也更有意义。同样的方法适用于 .dockerignore.eslintignore 以及团队维护的 tsconfig.json 中的 files 数组。

整理从聊天中粘贴的待办列表

Slack 和 Discord 粘贴出来的列表顺序混乱,包含半空行,以及多人重复说同一件事留下的重复条目。粘贴进来,勾选删除空行和删除重复项,然后排序。您会得到一个整洁有序的列表,可以直接放进任务追踪工具。

对国家代码、机场代码或货币代码列表排序

ISO 3166 国家代码、IATA 机场代码、ISO 4217 货币代码:这些都存在于受益于排序的查找文件中。这里不需要自然排序(代码是固定宽度的),但不区分大小写很重要,因为某些来源混合了 USDusd。排序,去重,粘贴回查找表。

对 package.json 依赖列表排序

package.json 中的依赖键在每次安装时会被 npm 7+ 按字母顺序排列,但如果您在仍锁定到 npm 6(或 yarn 1)的项目中编辑,顺序不会自动改变。粘贴依赖键,按 A-Z 排序,再粘贴回去。您下一个 PR 就不会在实际改动之上附带一个 200 行的重排序提交了。

行排序:快速参考

本工具提供的排序选项及其覆盖的边缘情况的简要说明。

TopicWhat this tool does
字典序 vs 排序规则字典序(码位)排序按原始 Unicode 值排列:A(U+0041)排在 a(U+0061)之前。排序规则排序遵循 Unicode 排序算法,将大小写字母交织排列。本工具默认使用排序规则;勾选区分大小写可切换为码位顺序。
区分大小写默认不区分:appleAppleAPPLE 比较相等。切换为区分后,按 Unicode 默认排序规则的第三级别,顺序为 A < a < B < b,与 C 语言环境结合时为原始码位顺序。
自然排序启用后,file2 < file10,因为 210 作为数字比较。禁用时,file10 < file2,因为 1(U+0031)在逐字符比较中小于 2(U+0032)。适用于文件名、版本字符串以及任何包含内嵌数字的列表。
区域感知排序遵守页面的语言设置,因此 é 在法语中排在 e 旁边,德语 ä 在 DIN 5007-2 电话簿顺序中被视为 ae,依此类推。如果设置了 LC_COLLATE,Unix sort 也会这样做;LC_ALL=C sort 则回退到码位顺序,速度更快但将重音字母视为外来字符。
空行处理空行在升序排序中排在任何非空行之前,因此它们会聚集在顶部。勾选删除空行可完全丢弃它们。输入末尾的换行符会被保留,确保输出通过 cat 等工具往返时不会出现意外。
稳定性排序是稳定的:在您的设置下比较相等的行保持原始的相对顺序。当您按前缀或不区分大小写排序,并希望在相等组内保留输入顺序时,这一点很重要。自 2019 年起,V8(Chrome、Edge、Node)和 SpiderMonkey(Firefox)都保证 Array.prototype.sort 是稳定的。
换行符(LF vs CRLF)输入按 \r\n\n\r 分割。输出默认用 \n 连接,可以整洁地粘贴到 Linux 和 macOS 工作流中。如果某个 Windows 工具需要 CRLF,将结果粘贴到支持 Windows 的编辑器中,以所需换行符保存即可。
字符编码输入作为 UTF-8 处理(浏览器中的文本已解码)。如果输入有 UTF-8 BOM,它会保留在第一行;如果要去掉它,sister 工具 whitespace-cleaner 可以处理。

行排序:常见问题

默认排序顺序是什么?

升序且区域感知,使用浏览器在页面语言设置下的 Intl.Collator。这意味着 A < a < B < b,就像 Excel 和 Google Sheets 的排序方式,而不是所有大写字母都排在小写字母之前的原始码位顺序。如果您想要码位顺序,勾选区分大小写:这会将排序规则设置为严格的第三级比较,与 LC_ALL=C sort 给出相同的顺序。

排序区分大小写吗?

默认不区分。AppleappleAPPLE 都会归并为相同的键,因此它们会聚集在一起,彼此之间的顺序保持输入时的先后顺序(排序是稳定的)。勾选区分大小写后,它们会按照 Unicode 默认排序规则的第三级别被区分为三个不同的值,排列为 APPLEAppleapple

支持文件名的自然排序(file2 排在 file10 之前)吗?

支持。勾选自然排序选项,内嵌的数字会作为数字进行比较,因此 file2.log 排在 file10.log 之前,v1.9 排在 v1.10 之前。实现使用 Intl.Collatornumeric: true 选项,与 macOS Finder 和 Windows 文件资源管理器用于排列文件名的是相同的底层能力。

可以反向排序(Z 到 A)吗?

可以。在排序方向中选择降序。排序器先按升序运行,然后翻转,这样可以在相等键之间保持稳定性:如果两行在您设置的大小写和自然排序条件下比较相等,翻转后它们仍保持原始的相对顺序。当您按子键(如 TSV 的第一列)排序时,这一点很重要。

重复行和空行怎么处理?

默认情况下两者都保留。排序是稳定的,因此重复行保持原始的相对顺序,空行在升序中聚集在顶部(它们排在所有非空字符串之前)。勾选删除空行可在排序前丢弃空行,勾选删除重复项可将相同的行合并为一行。如需有更多选项的专用去重工具,请使用删除重复行

有大小限制吗?

最多约 10 万行可以在一秒内完成浏览器内排序。超过 50 万行才会开始有明显感觉,主要是因为渲染结果面板(而不是排序本身)的代价变高了。对于数百万行的文件,Unix 命令 sort(使用 LC_ALL=C sort -u file.txt)速度更快且支持外部排序。GNU coreutils sort 手册涵盖了值得掌握的参数。

这个工具免费吗?需要注册吗?

免费,无需任何注册。没有账户,没有试用期,没有粘贴行数限制。一切都是在您浏览器中运行的 JavaScript,因此页面加载后即使断网也能继续排序。粘贴列表,选择选项,复制结果。没有任何功能锁在登录后面,也没有付费层级。

与在 Excel 中排序或使用命令行 sort 命令有什么不同?

无需打开电子表格,无需记忆命令行参数。在 Excel 中,您需要选中一列,打开数据菜单,选择排序,还要担心标题行是否误入选区。这里直接粘贴然后点击即可。与 Unix sort 命令相比,省去了与 LC_COLLATE 的纠缠,Windows 上也无需默认安装 sort;删除重复项选项等同于 sort -u 的功能,在一个界面中完成,无需上传任何内容。

我的文本是私密的吗?会上传任何内容吗?

不会上传任何内容。分割、比较和合并都在您的浏览器中进行;文本不会经过任何服务器,不被记录,也不通过任何第三方服务。您可以粘贴客户邮件列表、内部主机名或其他敏感内容,关闭标签页后不会留下任何痕迹。要验证,请打开浏览器 DevTools,切换到 Network 标签,点击排序时观察,没有任何出站请求。

排序会修改行的内容,还是只是重新排列?

只是重新排列。每行的文本保持与粘贴时完全相同,包括行首或行尾的空格,排序本身不会修剪、切换大小写或改写任何行。唯一会删除行的是您控制的两个选项:删除空行和删除重复项。将两者都关闭,输出会保留您输入的每一行,字符完全一致,只是顺序不同。

离线可用吗?可以在手机上使用吗?

两者都可以。由于是没有服务器调用的客户端 JavaScript,页面加载后可以断网,仍能继续排序——一些人正是因此将它加入书签。在手机上,输入和输出面板垂直堆叠,按钮仍在拇指可及范围内,因此将消息中的列表粘贴进来排序在小屏幕上完全可行,尽管较长的列表在笔记本上更易阅读。

隐私保护与工作原理

您的文本不会离开浏览器。分割、比较和合并完全在本地运行。我们不分析您的输入,不记录,也不进行任何服务器往返。排序本身依赖浏览器的 Intl.Collator,它实现了 Unicode 排序算法(UTS #10)。如需背景资料,维基百科有关于排序算法的详细介绍。