易陆发现互联网技术论坛

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

sed 加参数删除字符所在行

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

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

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

x
[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
/ A5 {' R* ?0 V2 n* |, UDEVICE=bond1.36 9 n' ]9 c) E6 W9 x2 o4 u8 q
NAME=bond1.36
8 A' N3 U5 Z8 w( g' v7 X2 |( L% Y( XBOOTPROTO=static
1 @1 E9 y; {5 {% gONBOOT=yes. J& J1 i# B# Z  y
IPADDR=172.16.6.20
4 h# {! ^) b' x/ Q8 |NETMASK=255.255.255.0
/ x! j' J7 {" d' j) qGATEWAY=172.16.6.2549 [1 J6 ?& B; H$ B  f! @
DNS1=10.17.1.1
* ~3 ]  w& |4 `9 R% p9 ^VLAN=yes
5 G( I& e* S3 r6 B; PNM_CONTROLLED=no
  L' v# b& u# m6 C2 I2 @7 i- l
, W. S8 P; M! I, |9 g* }+ k6 _[root@compute10 ~]# sed -i '/'"DNS1"'/d' /etc/sysconfig/network-scripts/ifcfg-bond1.36( e* ~  ~. \: b* D* t0 [  X

& X7 |8 k+ W# l) H9 M6 s& I[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
+ L0 Q" k- W+ X" W( q  D& N1 nDEVICE=bond1.36 8 g" P. r7 P: O' z. X$ S( r/ J
NAME=bond1.36
" y6 e( u  o3 d3 l" l/ U% d  eBOOTPROTO=static
5 t9 s) m: `" ]0 B* u* m, kONBOOT=yes
( r6 X' G' `4 }; Z% x2 SIPADDR=172.16.6.20- [# R+ h% q/ B/ t$ f. c/ t5 g* C
NETMASK=255.255.255.0
7 H1 ^9 J, T4 e& o$ _1 VGATEWAY=172.16.6.2548 N6 r) `: {% u
VLAN=yes7 v: L! ~5 n! B5 P
NM_CONTROLLED=no7 Q$ Y+ ], i0 g/ u: w6 `7 ~; o

: _) \/ {' i2 A7 T$ U' D
sed命令常用到的两个选项:+ o  m  t/ W  V% L- s  S  E8 ]7 L
-i : 直接在文件上编辑 (edit files in place)
& x. S; e5 S5 L2 P9 f-e[默认选项]:只在命令行输出,而文件不改变
$ [/ ~- B* S9 C6 H1 K5 |(add the script to the commands to be executed)1 `6 c4 y: h, B8 P+ k( v" A* t% _
注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)
sed命令删除特定行号
1 x9 w8 z/ J7 c; c8 [/ U/ ~删除第N行
3 m7 V7 d0 m3 `sed -i 'Nd' filename& c) a% [6 \: l) y- y7 C# |
) O# `% _8 D$ R; ^
删除第N~M行
  t1 `( d& Y( q* {9 R. y$ ]sed -i 'N,Md' filename # file的[N,M]行都被删除
+ i; P9 b% A2 o( c! K0 S0 b( V
$ w6 D' ^* P' z7 r% ^删除shell变量表示的行号(配合for等语句使用)" F! E) a1 \2 u* g5 L1 I' T$ w
sed -i "${var1},${var2}d" filename # 这里引号必须为双引号
# _1 b# E+ m( @+ P4 j% L4 k! @# g( O  M4 |# |& y' k
删除最后一行
0 q" k7 K* Z7 c" n0 H5 H, N7 s: psed -i '$d' filename

: j* p3 T0 A% V9 osed命令删除包含特定字符行
  d5 i& }0 \/ Z3 e! h9 H" n+ i删除包含"xxx"的行
' L+ V+ b! I) i8 Zsed -i '/xxx/d' filename
3 X" B  x1 Y# r/ Z1 U8 F
 楼主| 发表于 2021-10-25 11:20:27 | 显示全部楼层
sed删掉某一特定字符的行
$ T+ f3 ]( [; [& p% k; S7 Z 2 R; ^+ |  p; B- d
: _/ c" g" Y, l
sed -i '/关键字符/d' 文件名
7 |) V0 w  M, q. ]7 b4 }" u下面为去掉含变量情况
6 @3 X5 E1 P$ S* |$ {: gsed -i '/'"$mm"'/d'  11.txt
/ h. \8 K4 {5 s5 p# F9 f% a- c9 g7 O
% p/ [5 \9 q) f$ B使用sed删除匹配行的上一行和下一行6 u1 Z  ^: M4 g1 H

  {7 Q% i* t% |1 J1.删除匹配行的上一行和下一行:, {& s" t0 H. C7 L0 F0 N2 X

& i, n2 v" H4 h8 q8 s/ a5 |  Osed -i -e '/string/{n;d}' -e '$!N;/\n.*string/!P;D' file
1 W* c* X. p- c' Z$ G2.sed中使用变量,删除匹配行的上一行和下一行:
$ p5 O- G1 z7 z9 O; O
5 t' C5 H( |) U! J4 N2 U/ D: S2 Y 3 G& i5 H8 o$ V. l/ ^3 Q0 s: ?
AA=string #变量指定匹配字符串9 g& F5 i2 f! s5 g5 q8 R9 B
; P0 v+ y- C' d; s2 I: @
sed -i -e '/'"$AA"'$/{n;d}' -e '$!N;/\n.*'"$AA"'$/!P;D' file
2 c, g5 `/ h- N5 a
 楼主| 发表于 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', '超时未领完');
+ H+ u2 _& Z9 @) a& k7 ~4 bINSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');* Z" [+ x8 ^  N7 `
--
( m+ k. K5 W! Q# d  BONUSID number(11) ,$ l  v) l" \3 E9 @' d0 D
  DELETEFLAG number(2) ,
, G  [; C/ y8 {7 Y+ _  TYPE number(2) ,9 R, s# p, P+ _' G
);

  ~; G4 q5 K2 m
CREATE TABLE bonususer (
  r- N) ]- z! {7 t, u--
" j( G# z! {& ?9 o5 t  @" b  SENDUSERID number(11) ," v; M$ @8 F. T& e
  SENDUSERNAME varchar2(32) ,
9 ^# ?9 k: ^0 ?8 t0 X: P) `  BONUSTICKETNO varchar2(32) ,
( v3 M6 R9 J+ F% N. y7 E  g- k9 j/ T);

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');
" c& J8 L9 j  tINSERT 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');
: n% z" V1 i) @5 U  c0 V--2 E7 S  ^: V  Y2 J& c4 W
  receiveUserId number(11) NOT NULL,! Q8 \$ j5 ?8 k
  deleteFlag number(1) NOT NULL ,
) f, d1 \; D/ V/ T  createTime date ,
% a* W/ x& H  C! ?);

INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');
* m  J1 Q' N0 g1 N! C3 ]  \INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');& ?+ A. J" E7 n9 R8 p6 O

要求:) Y3 ?- T$ B1 g8 f
使用sed删除以)开头的行的上一行末尾的逗号
* \# L, D0 n- K% t苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。

答案:
9 G' u2 v3 Y; V7 P$ P/ P( P[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file6 W% }( y/ j8 E6 M
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
$ u0 Y& V0 y: K" b  s5 n/ CINSERT 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" z. N5 \# V" t9 W--
1 y* }8 f6 [! P, t; d& j5 K  BONUSID number(11) ,% f" `0 [; O9 Q- m6 G
  DELETEFLAG number(2) ,3 p5 V: s+ j& R
  TYPE number(2)
% E' U6 }" o  O  P& E);


- U- Y# S' p( E3 yCREATE TABLE bonususer (
* y0 x( B& D$ ]) o( Z5 x* G--* m; h/ I$ l, V7 f
  SENDUSERID number(11) ,
2 P% i# I, ?4 J+ V  P' q, Q; \  SENDUSERNAME varchar2(32) ,, z9 y" S7 ]+ y
  BONUSTICKETNO varchar2(32) 2 ~- f% O- t8 A8 b
);

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');, v0 I) h/ _  c: N* \  }( v
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');+ a, W6 E6 \( @8 Q  w* A
--
4 H+ T  r+ O9 R( O, l" B# X; {  receiveUserId number(11) NOT NULL,7 z) n& N; l8 P$ m& L9 _$ F; F
  deleteFlag number(1) NOT NULL ,
  Q- w1 |; G( D( o$ F7 I& g  s  createTime date 4 Z+ Z, ~1 E  N( a# b7 O5 O
);

INSERT INTO rb_bon6 S8 v1 e8 K, E, E& m

1 ^$ x8 O* H5 u) V$ v% E- J- }解释:
1 R9 i6 H% Y( t/ u# K\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)* `- X  H: r6 }+ ~/ I, q. C; t* Y
\s*就是有0到n个空格或\n+ O; q9 Q( N; F4 }
/,/{}只要找到“,”就执行{}里的语句# s+ i- ^3 M4 @$ s7 i7 L4 B
:loop就是个标识,bloop 就是跳转到:loop& Z* z, {; r& O) F, i, V2 E
N是把下一行加入模式空间
$ @# j) ~, l+ M9 y/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
* c- x6 B9 v9 S7 \s/,\s*)/\n)/ 就是去掉“,”号
8 D( |4 G7 [0 u: M8 D, n

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

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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