带有正则表达式的 sed,如果在 34 位置找到数字则删除行

sed with regex, delete line if a number is found at the 34 position

我希望使用以下命令删除(从文件中)与第 34 位数字匹配的所有行:

sed -n "/^.{33}16184198166000003.*$/!p" inFile >> outFile

它正在使用以下命令(我知道这很糟糕):

sed -n "/^.................................16184198166000003.*$/p" inFile >> outFile

我不明白为什么它在这两种情况下都不起作用。

这是我文件中的一些行:

aaaaaaaaaaasfqfqfqsfqfsqfsqaaaaaa16184198166000003qsdfqesrfzqssdgsdqsfsf  zerzer z ez r
sF SDF EZ   EZ FF F ZE  EFedff<df16184198166000003sssssssssssssssssssssssssssssssssssss

要查找的号码:

16184198166000003

该数字是第 17 个字符长,必须在第 34 个位置。每行代表一张帐单,这个数字可以出现在另一个位置(例如第 113 个位置)。在这种情况下,我不能删除该行。

您可以使用此 sed 来加快速度:

sed -i.bak '/^.\{33\}16184198166000003/d' file

这将从第 34 个位置开始查找 16184198166000003,如果匹配,则删除这些行。

.{33} 中,您将大括号用作正则表达式。默认的 sed 不解释它们,所以你需要使用 -r 来启用扩展正则表达式:

sed -rn "/^.{33}16184198166000003.*$/d" file

来自man sed

-r, --regexp-extended

use extended regular expressions in the script.

这样,{} 正则表达式就被正确解释了。

我认为您遗漏了括号中的转义序列。这对我有用:

sed  "/^.\{33\}16184198166000003.*$/d" input.txt > output.txt

在 ubuntu 14.04、bash 4.3.11、sed 4.2.2 上测试。

如果以上答案不适合您,请考虑使用群组:

sed  "/^.\(\{33\}\)16184198166000003.*$/d" input.txt > output.txt