使用正则表达式进行sed,如果在34位置找到一个数字,则删除行

时间:2015-07-17 15:27:35

标签: regex sed ksh

使用以下命令删除(从文件中)所有与第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位)。在这种情况下,我不能删除这条线。

谢谢,

3 个答案:

答案 0 :(得分:2)

使用.{33},您使用花括号作为正则表达式。默认sed不会解释它们,因此您需要使用-r来启用扩展正则表达式:

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

来自man sed

  

-r , - regexx-extended

     

在脚本中使用扩展正则表达式。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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