Bash 提取序列中缺少的数字

Bash 提取序列中缺少的数字,bash,shell,Bash,Shell,我使用grep从文件中提取了一些数字,假设它们是123561118。为了获得1..20中的缺失,我将它们放入文件中,并使用comm进行比较 a='1 2 3 5 6 11 18' printf '%d\n' $a | sort -u > 111 printf '%d\n' {1..20} | sort -u > 222 comm 111 222 rm 111 222 哪个输出 1 10 11 12 13 14 15 16 17 18 19 2 20

我使用
grep
从文件中提取了一些数字,假设它们是
123561118
。为了获得
1..20
中的缺失,我将它们放入文件中,并使用
comm
进行比较

a='1 2 3 5 6 11 18'
printf '%d\n' $a | sort -u > 111
printf '%d\n' {1..20} | sort -u > 222
comm 111 222
rm 111 222
哪个输出

    1
10
    11
12
13
14
15
16
17
    18
19
    2
20
    3
4
    5
    6
7
8
9

有没有不保存到文件的更方便的方法?

您可以迭代从1到20的数字,然后使用正则表达式将每个数字与
a
进行比较:

a='1 2 3 5 6 11 18'
for i in {1..20}; do
  re="\\b$i\\b"
  [[ "$a" =~ $re ]] || echo "$i"
done
正则表达式非常简单:
\b
是a,
$i
被扩展为1,2,…,20


上面将打印所有不在
a

中的数字。您可以迭代从1到20的数字,然后使用正则表达式将每个数字与
a
进行比较:

a='1 2 3 5 6 11 18'
for i in {1..20}; do
  re="\\b$i\\b"
  [[ "$a" =~ $re ]] || echo "$i"
done
正则表达式非常简单:
\b
是a,
$i
被扩展为1,2,…,20


上面将打印所有不在
a

comm^^中的数字,也就是说,可以轻松编写纯bash变体:
a='1 2 3 5 6 11 18';以美元计算的x;t[$x]=1;完成;为了((x=1;xThanks@anishsane。但是第二个输出空行。第一个需要
sort
1234…10…20
不被视为已排序,但是
11011…2203…
会被视为已排序。^^^我的错…对于第一个,使用
sort-un
而不仅仅是
sort-u
commnt可以很容易地编写:
a='1 2 3 5 6 11 18';for x in$a;do t[$x]=1;done;for((x=1;xThanks@anishsane。但是第二个输出空行。第一个需要
sort
1234…10…20
不被视为已排序,但是
11011…2203…
可以。^^我的错…对于第一个,使用
sort-un
而不是
sort-u
Hi@andlrc它可以工作,但我不知道为什么有两个back睫毛不只是一个?为什么理论上,
[[[$a”=~“\\b$i\\b”].\124; echo“$i”
不起作用
“\b”
应该起作用,但既然反斜杠是一个转义字符,我们需要转义它:
\\b
-
\b
,或者用单引号将其引起来:
'\b'$i'\b'
。为什么
[$a=“\\\\b\\i\\b”]
不起作用:这似乎是bash中的一个bug,这里有一个解释:Hi@andlrc它起作用了,但我不知道为什么两个反斜杠不只是一个?为什么
[[$a”=~“\\b$I\\b”].\124; echo“$I”
在理论上不起作用
“\b”
应该可以工作,但由于反斜杠是一个转义字符,我们需要对其进行转义:
\\b
->
\b
,或者将其放在单引号中:
'\b'$i'''\b'
。对于为什么
[[“$a”=~“\\b$i\\b”]]
不起作用:这似乎是bash中的一个bug,这里有一个解释: