找回密码
 注册
查看: 1745|回复: 2

sed 加参数删除字符所在行

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-10-25 11:20:01 | 显示全部楼层 |阅读模式
[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
7 }+ J+ ~% C, K; }DEVICE=bond1.36 . _9 Q1 W0 q$ w) s, Q/ F: }8 C
NAME=bond1.36
( a4 I. m7 L/ v% E4 F* @+ _/ rBOOTPROTO=static
( D4 y- i3 I* S4 R7 E( ~$ aONBOOT=yes+ t! k5 P, ]- J, M  U% n/ n
IPADDR=172.16.6.20
1 h" o5 v* c, Q4 tNETMASK=255.255.255.0
  e" C# h3 l& X! l( wGATEWAY=172.16.6.254
; z$ z2 L) k- Q) YDNS1=10.17.1.1% V8 @9 e, @- d; ]
VLAN=yes' A+ F+ p  |8 ~$ U
NM_CONTROLLED=no
! M* ]6 y/ U/ [
( E) q. U) E$ t( K- C* \3 U[root@compute10 ~]# sed -i '/'"DNS1"'/d' /etc/sysconfig/network-scripts/ifcfg-bond1.36+ O8 l; c7 C3 {; C9 `* N
7 V" y9 L% ]+ C+ t& q3 E# u
[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36 / X8 I. V) @0 ?/ a
DEVICE=bond1.36 % |- [; Y1 `; O& Q# U9 n# v
NAME=bond1.36
) b& y& V# Z4 ?2 i; gBOOTPROTO=static- v3 R7 \! o% K% |
ONBOOT=yes
* [# t3 x: s4 Z/ h5 cIPADDR=172.16.6.203 n9 ^. \0 @4 s/ u! c& d; L
NETMASK=255.255.255.0
2 ?: S" G1 o1 }- v$ }GATEWAY=172.16.6.2543 z" x9 q( `# R
VLAN=yes* V3 N. ^* f5 o
NM_CONTROLLED=no9 {, _9 E/ x' e: ?& n
9 n2 y7 M8 S- \  Q% H( D* R, X7 @$ J
sed命令常用到的两个选项:% ?+ X, j. ]$ N: Y: M. c
-i : 直接在文件上编辑 (edit files in place)
" W* i8 t' _" F: Z-e[默认选项]:只在命令行输出,而文件不改变( S# w3 k/ N! Q8 i
(add the script to the commands to be executed)
- e* v1 s$ ~( F注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)
sed命令删除特定行号# c, @) d6 H, ]0 Z" k
删除第N行9 V$ J# i! Z. ?( F( }
sed -i 'Nd' filename
) i4 R1 \- _/ i
8 w9 b$ y3 H! X$ G* }删除第N~M行  i9 |. u- J" C4 H
sed -i 'N,Md' filename # file的[N,M]行都被删除
( ^1 O2 ]3 s, X
! A) b: p. D' Y4 k. X  v5 S删除shell变量表示的行号(配合for等语句使用)6 S3 A' b* I2 w' M' K
sed -i "${var1},${var2}d" filename # 这里引号必须为双引号
7 B/ d1 h) b) b* r" v
7 `- c1 e5 c3 z! W# {4 E5 b% v删除最后一行4 v8 L# \. j  h; ]
sed -i '$d' filename

  }- w$ r9 E0 m, R$ Y0 Xsed命令删除包含特定字符行
, n8 l6 I  O! \3 n删除包含"xxx"的行9 t9 [0 M  @& s9 n- m/ G
sed -i '/xxx/d' filename
" g; b' @* M# C

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-10-25 11:20:27 | 显示全部楼层
sed删掉某一特定字符的行
5 T  H2 Y4 ]! O ( g; o  I. I0 v0 ^6 a) B+ p
5 d7 \" T) _7 s7 V
sed -i '/关键字符/d' 文件名
, N( F  G) k1 @0 |下面为去掉含变量情况
  F6 f: v! f  b6 J7 i9 t! dsed -i '/'"$mm"'/d'  11.txt
4 N6 e! M% J; H4 q, g% S2 ]) `2 w8 f
使用sed删除匹配行的上一行和下一行
5 P3 M- }# G% ?( t 8 j1 Y# k2 e; [8 o% W* e! E- u
1.删除匹配行的上一行和下一行:
. u& R# D0 U. }: L% ^$ N4 O9 Z$ e" E, r* K' _  F0 s
sed -i -e '/string/{n;d}' -e '$!N;/\n.*string/!P;D' file
; @9 M% o' f6 K, Y2.sed中使用变量,删除匹配行的上一行和下一行:
- [& g9 ^$ \! Q. G7 I, d% X( |7 I- E, C. O; {) }$ c9 e, C/ P

4 s2 M- d6 b* _9 u* g& VAA=string #变量指定匹配字符串& b' R/ _" y+ ^

' G) i+ }& a8 j) K5 e6 Psed -i -e '/'"$AA"'$/{n;d}' -e '$!N;/\n.*'"$AA"'$/!P;D' file
4 t4 Y1 B& e& h5 J

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-10-25 11:22:43 | 显示全部楼层
最近在学习Oracle11g数据库时,需要将MySQL数据插入脚本转换成Oracle脚本,以在Oracle数据库中新建表和插入数据,方便练习。可是MySQL脚本太大,普通文本编辑器无法处理(7个G),于是用Linux下的sed老牌流编辑器来做。其中,有一段SQL脚本内容如下,

INSERT INTO bonusreturnorder VALUES ('47', '224', '1300573', '2', '1', 'WX20160203083601539373', 'HBTK20160204020000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
; }$ M1 x4 J) k' p: q1 w7 kINSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');9 c" a8 F2 {  l
--
0 R. z( r8 a5 W  BONUSID number(11) ,
9 \* Y( f4 {6 F$ G$ _  DELETEFLAG number(2) ,9 S; X) y( h6 {3 y0 q- ~* v
  TYPE number(2) ,# @+ ?* O- U7 S( g# F
);


% H( P/ h& F6 p& [$ a1 w% nCREATE TABLE bonususer (2 N+ N- {9 \1 m/ V5 {; w
--8 I+ y# }* S6 u; Z) @* m
  SENDUSERID number(11) ,' ]! [+ k: K2 U% V3 e" [
  SENDUSERNAME varchar2(32) ,
2 ~2 `# u* X  W3 q  BONUSTICKETNO varchar2(32) ,
7 e* m" m5 J, w2 B% F: Y);

INSERT INTO bonususer VALUES ('332', '155', '100.00', '85705', '3', '2016-02-03 07:12:27', '2016-02-03 07:13:11', null, '1', '1322', null, 'HB201602030712277209291');% m9 E; U/ f9 z, |0 Y. b  f
INSERT INTO bonususer VALUES ('335', '155', '100.00', '1322', '3', '2016-02-03 07:12:27', '2016-02-03 07:12:38', null, '1', '1322', null, 'HB201602030712277209292');9 z0 r0 ?8 q& ?/ y# ]
--3 U" H" ~# ~: [( N! Z! z+ B
  receiveUserId number(11) NOT NULL,( X8 L) v" C7 r8 k
  deleteFlag number(1) NOT NULL ,; Y3 O6 H& F0 i6 o. c
  createTime date ,1 F) L. z$ L7 [
);

INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');
# r7 |! |# p9 }5 B/ u+ xINSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');3 ]9 Y9 n+ P3 ]

要求:
/ K0 v% U7 r, {0 @/ M' m使用sed删除以)开头的行的上一行末尾的逗号
/ s' T7 @7 R( E苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。

答案:
8 m1 {' w" Y$ n( z; U[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file
1 ]" N( w3 M6 B0 [8 M1 k) b20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
2 I- N7 q- Y+ R7 R. l- s* kINSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');) a, S2 p1 B5 h: o
--
8 H1 ?! h: @! i2 @$ p1 S) T3 q  BONUSID number(11) ,
* |: u, l5 ~7 |7 Q; j  DELETEFLAG number(2) ,
9 _. u- l9 [( v2 e- p  TYPE number(2) * }# i6 K$ @0 t9 P( Q
);


8 q4 Y' W1 B3 m, _CREATE TABLE bonususer (
7 ]) k1 }% b% s" h% ~--
- s9 C, \/ n. a, M! |5 ^  SENDUSERID number(11) ,: l. t2 {! \' H# ^! M+ `
  SENDUSERNAME varchar2(32) ,
8 Z& P+ Q5 F/ a4 a  BONUSTICKETNO varchar2(32)
- T( j# W0 q6 }  ]" k3 A( c);

INSERT INTO bonususer VALUES ('332', '155', '100.00', '85705', '3', '2016-02-03 07:12:27', '2016-02-03 07:13:11', null, '1', '1322', null, 'HB201602030712277209291');
2 s. {. q$ ?' S0 nINSERT INTO bonususer VALUES ('335', '155', '100.00', '1322', '3', '2016-02-03 07:12:27', '2016-02-03 07:12:38', null, '1', '1322', null, 'HB201602030712277209292');0 t: z4 Z& Q: A& F) G7 c
--
' C  k/ o' F* ~' e8 s  receiveUserId number(11) NOT NULL,! \3 s/ B# X3 J4 y+ M5 x
  deleteFlag number(1) NOT NULL ,1 U8 i, s4 _5 N+ p1 F
  createTime date
. \  F5 m/ f* T! T# L1 t  s, b. C);

INSERT INTO rb_bon4 M( F3 I- e3 @6 d2 J" R% F6 I7 J) g
; P5 |$ F( p. J. z" |
解释:- P* K& N4 H; _' K" b
\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
- ^" |  t& O0 i  @3 [5 C, Z$ }\s*就是有0到n个空格或\n
2 b1 N. H7 q+ ]4 s( k9 d) n. e/,/{}只要找到“,”就执行{}里的语句
9 b( u9 ?- L* `; y:loop就是个标识,bloop 就是跳转到:loop
4 K+ r: b; u4 N1 x- t" ~; hN是把下一行加入模式空间0 C% x$ Q3 J2 o# Q
/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
4 j3 n& s8 p3 p+ x$ r8 `2 O* f2 X. ls/,\s*)/\n)/ 就是去掉“,”号
9 M) g. J$ r9 k( ]! `

您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 03:24 , Processed in 0.017208 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表