LINUX基于sed从文件中删除文本部分

时间:2017-09-01 08:05:15

标签: mysql linux bash sed

我有大文本文件(471 615行)。它的结构就像:

use TABLE1/*!*/
good code here
use mysql/*!*/
bad code here
use TABLE1/*!*/
good code here
use mysql/*!*/ 
...
...

如何删除"错误代码"板块?当然我知道这将是正则表达式的一种循环,但如何制作呢?我已经使用bash循环从mysql二进制日志文件构建类似的文件,并根据行号删除了sed的一些内容,但是这个文件有太多的数据可以用行号来删除它们。

PS。我只是手动完成了1个月的时间,并且发生了23次错误的代码"。有6个月的时间来解决,因此大约会有130-140个出现。如你所见,我将不得不花一整天时间手动将它们删除

5 个答案:

答案 0 :(得分:1)

简单 awk 方法:

示例文件testfile

use TABLE1/*!*/
select user_id
from 
system_users
use mysql/*!*/
drop database
delete * from users
delete id from system_users
use TABLE1/*!*/
select
   sum(price)
from
   orders
use mysql/*!*/
update users
   set id = "bad boy"
drop table users

工作:

awk '/^use TABLE/{ f=1 }/^use mysql/{ print; f=0 }f' testfile

输出:

use TABLE1/*!*/
select user_id
from 
system_users
use mysql/*!*/
use TABLE1/*!*/
select
   sum(price)
from
   orders
use mysql/*!*/

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed '/^use/h;G;/^use mysql/M!P;d' file

use语句附加到每一行,并仅在附加部分中打印那些不包含use mysql的行。

答案 2 :(得分:0)

另一种sed方法

sed '/use mysql\/*!*\//,/use TABLE1\/*!*\//{//!d}' filename

搜索使用mysql之间的所有内容...并使用TABLE1 ...然后删除除包含搜索模式的行之外的所有内容。

答案 3 :(得分:0)

sed是s/old/new/,就是全部。你没有s/old/new/这样做,所以你不应该考虑使用sed。只需使用awk:

$ awk '/^use mysql/{f=1} /^use TABLE1/{f=0} !f' file
use TABLE1/*!*/
good code here
use TABLE1/*!*/
good code here

如果您喜欢高尔夫,可以将其减少到:

$ awk '/^use/{f=/mysql/}!f' file
use TABLE1/*!*/
good code here
use TABLE1/*!*/
good code here

答案 4 :(得分:0)

我尝试了RomanPerekhres和Raman Sailopal解决方案。首先削减太多(文件开头的一些标题。第二个做得很好,但留下了一些问题。我没有尝试分析原因,只是改变了策略。我只是删除了包含一些特定单词的每一行,如GRANT TO,功能,创建用户,删除用户,权限等(与sed offcourse)。这样我删除了与mysql表连接的所有命令。

无论如何,谢谢大家的帮助。