我有大文本文件(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个出现。如你所见,我将不得不花一整天时间手动将它们删除
答案 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表连接的所有命令。
无论如何,谢谢大家的帮助。