为什么sed命令会跳过bash中的一些行?

为什么sed命令会跳过bash中的一些行?,bash,csv,sed,Bash,Csv,Sed,我有一个csv文件,其顶部如下所示: s_m_title ,, 7988114_lig2 7988114_lig2 7988114_lig3 7988114_lig2 7982570_lig2 7982570_lig2 9081391_lig2 9081391_lig2 6555615_lig 7988114_lig2 7988114_lig2 7988114_lig2 7988114_lig3 7988114_lig2 7982570_lig2 7982570_lig2 9081391_li

我有一个csv文件,其顶部如下所示:

s_m_title
,,
7988114_lig2
7988114_lig2
7988114_lig3
7988114_lig2
7982570_lig2
7982570_lig2
9081391_lig2
9081391_lig2
6555615_lig
7988114_lig2
7988114_lig2
7988114_lig2
7988114_lig3
7988114_lig2
7982570_lig2
7982570_lig2
9081391_lig2
9081391_lig2
7988114_lig2
我想删除所有不以数字开头的行。然后我运行这个sed命令将包含数字的每一行打印到一个新的csv文件中

sed-n-e'/1/{p;n;}'-e'/2/{p;n;}'-e'/3/{p;n;}'-e'/4/{p;n;}'-e'/5/{p;n;}'-e'/6/{p;n;}'-e'/7/{p;n;}'-e'/8/{p;n;}'-e'/9/{p;n;}'test all.csv>改进的2.csv

新csv文件的顶部如下所示:

s_m_title
,,
7988114_lig2
7988114_lig2
7988114_lig3
7988114_lig2
7982570_lig2
7982570_lig2
9081391_lig2
9081391_lig2
6555615_lig
7988114_lig2
7988114_lig2
7988114_lig2
7988114_lig3
7988114_lig2
7982570_lig2
7982570_lig2
9081391_lig2
9081391_lig2
7988114_lig2
sed命令正确地删除了s_m_标题和、、行,但也删除了6555615_lig行。为什么?

我发现如果我用两个命令

sed'/,/d'测试\u all.csv>improved3.csv

sed'/s\m\u title/d'improved3.csv>improved2.csv


我得到了正确的输出,没有任何编号的行被删除。那么,为什么使用sed会删除一些编号的行呢?

我相信您希望打印任何一行,其中包含1、2、3、4、5、6、7、8或9。在这种情况下:

sed -n '/[1-9]/p' test_all.csv 
或:

或者,要打印除前两行以外的所有行,请使用:

sed '1,2d' test_all.csv
或:


如果您只是想回显以数字开头的行,可以使用以下方法:

sed -n '/^[0-9]/p' test_all.csv
或者只是格雷普:

grep '^[0-9]' test_all.csv

使用SED查看的行为是由N命令的使用引起的。当执行命令时,N命令移到下一行。

Sed读取第一行输入[s_m_title],没有匹配的命令,因此由于-n选项,它不会回显任何内容,并移动到下一行文本

它读第二行[,]。同上

它读取第三行[7988114_lig2],它与第一个命令的模式[/1/]相匹配,因此它通过打印该行并移动到下一行输入[7988114_lig2]来执行该命令,但它保留在命令列表中的当前位置。因此,现在它将新的输入行与第二个命令[/2/]的模式进行比较。。。等等


碰巧,当它用6555615_lig读取该行时,它已经深入到您的命令列表中,超过了/6/模式。由于该行无法匹配任何剩余的命令[/7/、/8/、和/9/],因此sed到达命令的末尾,对该输入行不进行任何回显,获取下一行输入[7988114_lig2],并从第一个命令开始。它只打印以0-9之间的任何数字开头的行

sed '/^[0-9]/!d' filename.csv

因为要打印第1行,您需要/s_m_title/{n;p}或1p或/s_m_title/p,所以您的正则表达式中没有一个与s_title匹配。话虽如此,我不明白你为什么要这么做,但我相信,如果你说当数字出现在以字符或特殊符号开头的行中时,Logic(逻辑)这个命令起作用吗?最初我认为原始海报需要包含数字的行,但我更新了答案,只保留以数字开头的行。