我有一个包含整数(行号)和文本的文件。通过提取 PDF 文件,这些行号被放入与文本不同的行中,我想删除所有这些行号。我不太擅长正则表达式,但我 100% 确定这应该不是很难。我使用 vim/nvim,但如果我必须使用 awk/sed,那对我来说也行得通。
文件看起来像这样:
123
124
125
Text was found in
those three lines
should stay
因此,理想情况下,我想搜索:所有以正整数 (1,2,3...123456) 开头且仅包含该整数的行。应将其删除。
任何帮助深表感谢。
奖金挑战:出于某种原因,有些行以 开头^L1234
,因此有一个额外的特殊字符。有时我也想删除这些。不过可以分开进行。
答案1
[0-9]
是一个简单的收藏几乎可以在任何地方使用的数字。在 Vim 中,您也可以使用\d
(十进制数字)。- 您需要一个或多个实例:附加
\+
乘数。 - 这应该是行中唯一的东西,所以正则表达式需要锚定到开始和结束(分别通过
^
和$
)。 - 您想要尝试匹配所有行;在 Vim 中,这是通过 来完成的
:global/{pattern}/
。 - 匹配的线应该是
:delete
d。
综合起来:
:global/^[0-9]\+$/delete
您也可以使用sed
;它更快并且以非交互方式工作。由于它会自动将任何规则应用于所有输入行,因此您不需要:global
,并且:delete
只是一个d
。使用-i
,替换已完成(因此请确保正确无误并备份原始文件!)
sed -i -e '/^[0-9]\+$/d' file
对于可选前缀,其乘数为\?
。如果那^L
是一个字符,您可能需要在 Vim 中将其输入为<C-V><C-L>
。
答案2
在 Vim 中删除以整数开头且仅包含整数的行
:%s/^[0-9]\+\n//gc
解释
:%s//
- 全局搜索和替换^
- 从行首开始[0-9]
- 匹配数字\+
- 贪婪匹配一个或多个\n
匹配换行符(注意:检查行尾,这些行尾在不同系统之间有所不同,并且可能是例如\r\n
)gc
- 全局匹配 + 确认(c
如果有很多或者你确定,则删除)
输出
123
124
125
Text was found in
those three lines
should stay
:%s/^[0-9]*\n//g
Text was found in
those three lines
should stay
奖金
每terdon 对 U&L 的回答,^L
是form feed character
,可以使用 删除sed
:
sed 's/\o14//g' file
值得阅读该答案以了解其他方法。