易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 1740|回复: 2
收起左侧

sed 加参数删除字符所在行

[复制链接]
发表于 2021-10-25 11:20:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36 ; R/ Q4 z, m# t: `8 S4 Q. m, t/ F
DEVICE=bond1.36
, J" R$ ?- x. x) f5 _; BNAME=bond1.36
9 z6 m' J3 @# C" ~5 t% p! X4 C+ RBOOTPROTO=static
/ O+ ^: i/ `0 N' eONBOOT=yes6 W% Q' y' l8 q. p4 K9 [
IPADDR=172.16.6.20
0 O; q3 F- o' d/ p' E7 O, XNETMASK=255.255.255.0
+ x/ z3 {6 E0 Y% AGATEWAY=172.16.6.254  n8 K5 d; `6 s8 w' q$ R4 Z
DNS1=10.17.1.15 _) f8 l1 s# Q9 B" Y  y
VLAN=yes1 ]% O" _) m5 [& l3 ]$ e, ^
NM_CONTROLLED=no" s& |4 H! O0 k* N. {* t

9 c4 J$ y" I7 d0 @+ X" u, Y[root@compute10 ~]# sed -i '/'"DNS1"'/d' /etc/sysconfig/network-scripts/ifcfg-bond1.362 `  f% ~1 G$ i

- a0 H% s5 j( ~& y. L( o[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
  H: c, V1 J: H4 `8 [- LDEVICE=bond1.36
! W5 A7 l3 F* R2 @3 a: v3 t. yNAME=bond1.363 ^2 Z8 {: s; L' l; M# C
BOOTPROTO=static
0 A5 m" z- n! [% h: KONBOOT=yes' J9 y& r5 q3 z/ ], Q; A1 v/ X& j
IPADDR=172.16.6.20' X  \% F7 ^/ z, h# q( _
NETMASK=255.255.255.0
: S" p" C& Z& J  r0 g3 Z2 wGATEWAY=172.16.6.254
$ v  p) `' s# t$ CVLAN=yes) a( {# d, r+ o/ w1 ?
NM_CONTROLLED=no9 ^, X  Q# M- V, F2 X
: k; a4 I6 C, V$ x
sed命令常用到的两个选项:
' `% p- b  {" q-i : 直接在文件上编辑 (edit files in place); ~2 j% D% b+ P/ n& X- S5 F
-e[默认选项]:只在命令行输出,而文件不改变2 b* e1 N4 O+ y9 ^
(add the script to the commands to be executed)
+ [: K& _3 G  D1 b: h注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)
sed命令删除特定行号
) p2 I' d, l* |4 f/ v$ m删除第N行
; m6 a: d4 G0 G! v& Q+ X7 Psed -i 'Nd' filename
* F" k% c8 y0 S& e& ]- e
0 L& l* F  L$ `9 C7 C删除第N~M行
- t% k) e8 ?. Ased -i 'N,Md' filename # file的[N,M]行都被删除9 J+ C. {1 J6 A4 F+ A4 c8 i0 x  n- l

/ M; P# Z$ V) |" s删除shell变量表示的行号(配合for等语句使用)
# s0 }8 [1 z" f5 @; qsed -i "${var1},${var2}d" filename # 这里引号必须为双引号# M% o) G' u' ~9 c" r# N6 y1 F  z
& f% v. T8 s4 e# K3 j& W
删除最后一行* G1 s. k( n% A3 g  o
sed -i '$d' filename

& N. X3 h: s5 u7 @& x, Rsed命令删除包含特定字符行0 o# `" b% A' _9 b& Y& T
删除包含"xxx"的行, _. m$ k% t. v8 y  r5 z" k
sed -i '/xxx/d' filename
- w3 K2 Q% r  G2 K5 F, \5 u
 楼主| 发表于 2021-10-25 11:20:27 | 显示全部楼层
sed删掉某一特定字符的行
9 w" M& k3 H. p* i! Y! x , Z7 F% X" P9 ?9 h1 v- [8 Y

8 Q" g9 v0 z, a8 B% E" f" }+ }! _sed -i '/关键字符/d' 文件名* o! b; a/ ]3 v: g1 h$ I
下面为去掉含变量情况
3 L8 Z7 _0 a1 P7 S/ tsed -i '/'"$mm"'/d'  11.txt5 \/ n4 F1 Z5 r& K

" @, y5 B1 w) v$ v+ q# y使用sed删除匹配行的上一行和下一行
) W5 G# O+ l4 C6 X , V  H: R( X7 V( V& @0 \
1.删除匹配行的上一行和下一行:
: Z2 a2 w8 q- ^! l$ y  c( `7 w  _* N, B" A+ _6 [( m1 r0 L5 t5 L, N
sed -i -e '/string/{n;d}' -e '$!N;/\n.*string/!P;D' file' x6 D- N0 M# W  @
2.sed中使用变量,删除匹配行的上一行和下一行:3 Z8 k  S9 F" l( z  B$ ^7 ]& J

( U' c: }3 `, z( j" L$ Q' H$ F   V) m! p$ i+ p$ }  D, h3 g
AA=string #变量指定匹配字符串
$ K, g8 r6 [: ~# q% G2 f5 M
/ Z6 r$ e. T; k% jsed -i -e '/'"$AA"'$/{n;d}' -e '$!N;/\n.*'"$AA"'$/!P;D' file9 D" F/ s" q& O1 s; ?
 楼主| 发表于 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', '超时未领完');1 i) }3 {% S% J* t
INSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');' b2 A6 [# e6 f9 G# ~; \
--  g. Q# G8 M5 P. l
  BONUSID number(11) ,
3 ]3 W3 `2 C1 h7 _. l  DELETEFLAG number(2) ,' N- v' P2 C8 M; j6 I, F
  TYPE number(2) ,( a& h9 M% B3 `7 p# |
);

6 @8 x: U2 q! v1 J1 @1 J
CREATE TABLE bonususer (4 N& f4 S$ d7 y- Z1 L* ~8 P
--
! C7 C4 O- W- h2 |! Y* n3 t& n  SENDUSERID number(11) ,
" |2 S( y  ^' }4 X$ ?8 b9 B: a. I) x6 j  SENDUSERNAME varchar2(32) ,
9 P9 E0 c6 T9 q/ a: h  i) G5 x  BONUSTICKETNO varchar2(32) ,2 J( }% M2 T1 E0 b% a
);

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');5 {6 x' Z3 g9 M8 e
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');. s5 y+ a3 y5 J" c* Q" O
--9 k- u5 F- L, @" @4 s1 a0 x+ X
  receiveUserId number(11) NOT NULL,6 C) ?/ ]& T4 B2 e
  deleteFlag number(1) NOT NULL ,
+ j4 u0 `; r# I  createTime date ,/ I1 `) y/ s5 w& V( Q
);

INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');2 [! k2 H  H& M$ m2 }. o
INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');
: b1 }6 l' [8 T7 x  R

要求:
! Z3 a- t5 Z% b* y使用sed删除以)开头的行的上一行末尾的逗号
" l2 W+ f, @- A0 }+ S& T+ U8 e苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。

答案:
# i$ b0 r  v# p. S" W# B[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file  w" N- R, o! v, P
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
+ e4 T/ x: P% G3 ?2 K" Z0 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', '超时未领完');2 @0 v3 e* W5 T# t- W
--
! O/ M4 [! ^# n7 R. [* \4 i  BONUSID number(11) ,
2 d; z0 C7 T) e8 C5 s2 I  DELETEFLAG number(2) ,1 e. }- f' ?/ D& H0 e/ `  o
  TYPE number(2) 5 [% |3 p% C+ S8 c
);

3 v5 ^8 \- M! v, }* V
CREATE TABLE bonususer (5 Y2 J, s0 F6 o
--: ~3 a0 ]5 d4 P' [
  SENDUSERID number(11) ,
* k5 g" G0 q- \/ K/ ^# ]4 w; u$ {2 Y) j  SENDUSERNAME varchar2(32) ,! I7 b6 S  ^; g9 k$ d+ x
  BONUSTICKETNO varchar2(32) 4 V8 M. B6 Q$ [6 l, L7 }3 z4 x
);

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');
) \, L; z! A, z4 }& \% r5 b4 UINSERT 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');& I, N9 }  d; K! F3 k
--1 W- q8 O" \, m/ W; r
  receiveUserId number(11) NOT NULL,8 V& r+ o+ ]8 M; B$ K
  deleteFlag number(1) NOT NULL ,  K! i% B7 q" b4 X% N
  createTime date
" U$ ~+ {! t. @& j) U2 d/ X);

INSERT INTO rb_bon
0 H1 U( X  }8 O9 k7 k0 R4 M7 `5 ?
解释:
3 V; L  w# w% ?0 ~; D7 O\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
2 e& [5 h( E* S\s*就是有0到n个空格或\n
2 U2 }1 g  J5 V+ I; k. u0 U5 V3 {/,/{}只要找到“,”就执行{}里的语句2 s) Z' \; ~. v: v  r3 f
:loop就是个标识,bloop 就是跳转到:loop0 W& A" G: v6 O' O' _- R. ~* {
N是把下一行加入模式空间
) O0 P% x: {6 p& k' M/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
# E5 p& u1 q9 e- qs/,\s*)/\n)/ 就是去掉“,”号
) q2 \  @' ?: `

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

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:40 , Processed in 0.047874 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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