使用以下命令删除(从文件中)所有与第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位)。在这种情况下,我不能删除这条线。
谢谢,
答案 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
,如果匹配则会删除这些行。