我想在txt文件中找到按字母顺序排列的所有序列,而不进行排序。
示例:假设文本文件如下所示:
aedftg
wqof
abcdef
oufn
pqrs
aabcd
Run Code Online (Sandbox Code Playgroud)
输出应该是
abcdef
pqrs
Run Code Online (Sandbox Code Playgroud)
也没有像aabcd
.
一种选择,硬编码为英语:
grep -ix 'a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*' input
Run Code Online (Sandbox Code Playgroud)
感谢NinjaBearMonkey拼写出这是在我的头上发芽的想法; 我修改了正则表达式以允许重复字符 ( aabcc
)。
另外一个选项:
使用sort
检查特定于语言环境的排序规则是一种更好的方法,这样您就不必对字母表进行硬编码。正如mikejonesey 所做的那样,这意味着您必须将行的字符拆分为单独的行。我已经使用 shell 脚本(使用支持子字符串扩展的现代 shell)来避免调用 sed,并且还使用了sort
-c 选项来指示输入是否已经排序:
while IFS= read -r line
do
for((i=0; i < ${#line}; i++))
do
printf '%s\n' "${line:i:1}"
done | sort -c 2>/dev/null && printf '%s\n' "$line"
done
Run Code Online (Sandbox Code Playgroud)
如果sort
发现不符,则输出到stderr,但我们只关心返回码,所以我放弃stderr。
一个非英文输入的演示($
字符是shell提示):
$ cat input
????
???
$ ./sorted2 < input
???
$
Run Code Online (Sandbox Code Playgroud)