带有正则表达式的 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
我希望使用以下命令删除(从文件中)与第 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