排序分隔符:大括号和方括号

排序分隔符:大括号和方括号

我正在使用这个命令

cat acronyms.tex | sort -t{ -k1

对字符串格式如下的文件进行排序

\newacronym{ex}{EX}{Expanded}

我想按第一对大括号的内容进行排序。然而,有些线路是这样的

\newacronym[a string]{ex2}{EX2}

我使用的命令无法区分{[,结果是第二个字符串排在第一个字符串之前。

我怎样才能让它区分[{

答案1

如果出于某种原因您需要排序只是第一对大括号的内容,最简单的方法可能是使用装饰-排序-取消装饰模式。我要使用sedcut,但是有很多选项可以在 shell 中实现此功能:

sed -e 's/^\([^{]*{\([^}]*\)}\)/\2 \1/' < data|sort|cut -d' ' -f2-

sed命令替换一切直到结尾第一对大括号的包含大括号的内容、空格,然后是原始字符串。可以像往常一样排序。然后我cut再次设置我在开始时添加的字段。

这将很好地处理键中的奇数字符和不均匀的长度,尽管空格会成为问题,并且转义\}也会成为问题。如有必要,可以使用不同的分隔符。


如果数据是:

\newacronym{A}{EX}{Expanded}
\newacronym{F}{EX}{Expanded}
\newacronym{D}{EX}{Expanded}
\newacronym{C}{EX}{Expanded}
\newacronym[abc]{B}{EX}{Expanded}
\newacronym{CD}{EX}{Expanded}
\newacronym[def]{E}{EX}{Expanded}

那么sed命令的结果是:

A \newacronym{A}{EX}{Expanded}
F \newacronym{F}{EX}{Expanded}
D \newacronym{D}{EX}{Expanded}
C \newacronym{C}{EX}{Expanded}
B \newacronym[abc]{B}{EX}{Expanded}
CD \newacronym{CD}{EX}{Expanded}
E \newacronym[def]{E}{EX}{Expanded}

其余的就很简单了。

答案2

使用-k1sort使用整行作为排序键。这不是你想要的。

我假设您想使用exand ex2(如在 中找到的{...})作为密钥。为此,请指定-k2为排序字段。

这将拾取第一个之后的所有内容{并将其用作密钥。

\newacronym{ex}{EX}{Expanded}
^^^^^^^^^^^ ^^^ ^^^ ^^^^^^^^^
field 1     f2  f3  field 4

\newacronym[a string]{ex2}{EX2}
^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^^^
field 1               f2   f3

仅有的使用第二个字段作为键(而不是该行的其余部分),使用-k2,2.

测试:

$ sort -t '{' -k2,2 file
\newacronym[a string]{ex2}{EX2}
\newacronym{ex}{EX}{Expanded}

该行仍然以错误的顺序出现。这是因为ex2}排序在前面ex}(在 ASCII 表中}排在后面,并且我使用的是 POSIX 语言环境)。2

再试一次,但这次是在 Ubuntu 上使用语言环境(应该可以在任何 glibc Linux 和除或语言环境en_US.UTF-8之外的大多数语言环境中工作):CPOSIX

$ LC_COLLATE="en_US.UTF-8" sort -t '{' -k2,2 file
\newacronym{ex}{EX}{Expanded}
\newacronym[a string]{ex2}{EX2}

根据您的区域设置,您可能需要也可能不需要添加该LC_COLLATE=...位。


请注意,这sort是一个独立于bashshell 的实用程序,并且无论 shell 是什么,它的工作方式都是相同的。因此,这不是一个“bash排序”问题,只是一个sort问题。

相关内容