sed 删除以 [0-9]% 结尾的行

sed 删除以 [0-9]% 结尾的行

我正在编写一个记录 stdout-stderr 的脚本。

该日志包含以下多个实例:

(Reading database ... 
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 52099 files and directories currently installed.)

如何删除以[0-9]%- 结尾的行,使行变为:

(Reading database ... 
(Reading database ... 52099 files and directories currently installed.)

我尝试过各种形式:

sed -i '/[0-9%]$/d' ~/test/Log

...包括转义 % - 但没有运气。我找不到任何我发现有效的例子。

我特别想使用sed,有什么想法吗?


sed -i '/[0-9%]$/d' ~/test/Log行似乎适用于测试文件 - 但由于某种原因不适用于实际日志。

我已经尝试过/%$/d(可能适用于测试文件) - 它不适用于日志..

我尝试过/[0-9]%$/d- 但对日志文件没有影响......


sed版本:

~ sed --version
sed (GNU sed) 4.2.2

日志路径~/test/Log


'/[0-9]%[[:blank:]]*$/d'似乎也没有更改日志..

关于输出 - 没有错误。对文件进行 Cat'ing 显示正确的输出(已删除行)...


笔记:

我发现当我cat打开文件时,线条消失了 - 当我在编辑器(Sublime Text 3)中打开文件时 - 线条仍然显示。

我尝试重新启动,以防某处有交换文件,但我仍然得到相同的结果。

答案1

%括号内不应该有。正确的实现是:
sed -i '/[0-9]%$/d' ~/test/Log

答案2

事实证明该文件具有控制字符 - 具体来说:^M

cat没有显示^M——但是less..

输出less如下所示:

Get:3 http://us.archive.ubuntu.com/ubuntu/ vivid-updates/main policykit-1 amd64 0.105-8ubuntu3 [51.6 kB]
Fetched 102 kB in 0s (144 kB/s)
Selecting previously unselected package libpolkit-agent-1-0:amd64.
(Reading database ... ^M(Reading database ... 5%^M(Reading database ... 10%^M(Reading database ... 15%^M(Reading database ... 20%^M(Reading database ... 25%^M(Reading database ... 30%^M(Reading database ... 35%^M(Reading database ... 40%^M(Reading database ... 45%^M(Reading database ... 50%^M(Reading database ... 55%^M(Reading database ... 60%^M(Reading database ... 65%^M(Reading database ... 70%^M(Reading database ... 75%^M(Reading database ... 80%^M(Reading database ... 85%^M(Reading database ... 90%^M(Reading database ... 95%^M(Reading database ... 100%^M(Reading database ... 52099 files and directories currently installed.)
Preparing to unpack .../libpolkit-agent-1-0_0.105-8ubuntu3_amd64.deb ...
Unpacking libpolkit-agent-1-0:amd64 (0.105-8ubuntu3) ...

请注意,“(正在读取数据库”行是一个长字符串(带有 ^M)。

删除该行会sed删除整行,现在原因很明显了。

sed字符串替换确认字符串的一部分,因此它可以用于分解该行。

这就是最终工作的结果(^M 是字符串上的 \r):

sed -i 's/(Reading database \.\.\. [0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. [0-9][0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. [0-9][0-9][0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. \r//g' ~/Desktop/Log
sed -i '/^\s*$/d' ~/Desktop/Log

它将行的指定部分替换为“nothing”,最后一行删除带有“nothing”的行...所以结果是:

Get:3 http://us.archive.ubuntu.com/ubuntu/ vivid-updates/main policykit-1 amd64 0.105-8ubuntu3 [51.6 kB]
Fetched 102 kB in 0s (144 kB/s)
Selecting previously unselected package libpolkit-agent-1-0:amd64.
(Reading database ... 52099 files and directories currently installed.)
Preparing to unpack .../libpolkit-agent-1-0_0.105-8ubuntu3_amd64.deb ...
Unpacking libpolkit-agent-1-0:amd64 (0.105-8ubuntu3) ...

我确信有一种更简单的方法 - 但我的实验都不起作用,包括分组({[0-9],[0-9][0-9],[0-9][0-9][0-9]})等......

经过几个小时的混乱,我愿意接受我冗长的答案..:)


更新

用户唐克里斯斯蒂有一个更有效的解决方案可以达到相同的结果:

sed 's/.*(Reading/(Reading/'

(...如果他发帖则等待接受)

答案3

这是一份工作grep

grep -vE '[0-9]%$'

v 的意思是vert,E 是扩展正则表达式。

答案4

您的日志文件末尾可能有空格、制表符或其他非打印字符,位于“%”之后。尝试:

 grep "Reading Database" ~/Test/Log | cat -A

(注意:cat -A需要 GNU cat,我假设你有 GNU cat,因为你有 GNU sed)

%如果这些线之间和线上有任何东西$,那就证实了这一点。在这种情况下,请将 sed 脚本更改为:

sed -i '/Reading Database.*[0-9]+%/d'

相关内容