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

sed 加参数删除字符所在行

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-10-25 11:20:01 | 显示全部楼层 |阅读模式
[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36 / `( |( E% g9 E0 K- e  y
DEVICE=bond1.36
" t7 G, u: p; w5 F6 ~9 WNAME=bond1.36+ S6 y. y  c1 ]$ ~0 r0 I; H5 m7 J
BOOTPROTO=static& _/ s% B& K8 R- K6 H
ONBOOT=yes
* [' I2 m5 v6 V. ZIPADDR=172.16.6.20
5 K7 z+ M* f! ^  e1 f2 _* o$ pNETMASK=255.255.255.02 W1 \3 n* e$ n* L5 U0 W9 {; \
GATEWAY=172.16.6.254
( v9 V, V4 D- A, JDNS1=10.17.1.12 P+ g" x4 O" T
VLAN=yes
- W: P0 L8 b+ {  A* {2 _" oNM_CONTROLLED=no
, B+ M; Z' y/ n  @/ y% `
. u' i3 I3 x8 ^' Q" y$ d[root@compute10 ~]# sed -i '/'"DNS1"'/d' /etc/sysconfig/network-scripts/ifcfg-bond1.36  f* x5 j. f" O  O: Z! f

$ j* _' v# D+ X% @: w[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36 # P6 ]6 g$ k+ E8 x9 x0 |$ q1 _& q: v
DEVICE=bond1.36 2 P# v5 ^* N" t2 q1 A9 Z& ~; @
NAME=bond1.36+ o9 @- ~4 g( M% V3 c; Z
BOOTPROTO=static
1 H; ~6 E& d3 S9 |/ gONBOOT=yes
" {" [9 O% A! b2 M* ^IPADDR=172.16.6.20
; u  S5 `2 m2 xNETMASK=255.255.255.0
: D) U2 G% x5 y. d; n+ qGATEWAY=172.16.6.254
( o6 s3 z: e7 j4 l$ r0 {VLAN=yes
' z. }: ~7 u2 B; i: R1 O: YNM_CONTROLLED=no* n  _- u3 x3 y4 P( k4 ~
" W5 z+ W: N: k8 w. \$ c- P
sed命令常用到的两个选项:
5 @7 W2 n/ J- m8 k: A7 x1 j-i : 直接在文件上编辑 (edit files in place)
/ d7 i/ d7 C3 S-e[默认选项]:只在命令行输出,而文件不改变* S  k6 y2 C& ^
(add the script to the commands to be executed)
1 y) n/ H9 t1 H7 R5 Y9 v! M注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)
sed命令删除特定行号
) T+ J- U8 x" F/ u: r) Y" S" R删除第N行
% N: t8 C' m) U1 nsed -i 'Nd' filename3 m# s+ o% G1 _% P. P" J2 a; U
& E. s- [5 c! T! g5 j7 H: h/ J
删除第N~M行8 m. {8 p" V% u4 ]7 w, J# K- ^
sed -i 'N,Md' filename # file的[N,M]行都被删除0 l7 X; X5 S% _% i0 ^0 a5 a; ^
7 o. a% @" \, v
删除shell变量表示的行号(配合for等语句使用)
: i8 ]" r/ r9 E/ g4 _sed -i "${var1},${var2}d" filename # 这里引号必须为双引号9 D) Y8 a6 j$ S4 x
( S0 ?6 s, K6 `$ I
删除最后一行0 m: M  O: I$ T1 b# @. y
sed -i '$d' filename
* [  h& J' a( Q3 j1 Q, C
sed命令删除包含特定字符行" m# V5 ^0 f" Z1 ]% x& m" F0 g" o
删除包含"xxx"的行
9 A5 y! ]/ R! Z2 I, I: ^3 Ased -i '/xxx/d' filename

2 L, t4 e/ [0 z& r

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-10-25 11:20:27 | 显示全部楼层
sed删掉某一特定字符的行
2 g# }+ O' j/ W( n/ x# @3 e/ Z! o% v ; H' m' B2 {9 L% }! c' o7 w
6 C. A, E, G7 V" _5 o. _! k
sed -i '/关键字符/d' 文件名
$ @8 l1 a( Y( a# Z* \下面为去掉含变量情况/ |6 }/ W5 _, I) ~3 M2 f7 f
sed -i '/'"$mm"'/d'  11.txt
8 l3 V' y- i' u2 {& J; f7 S
- x; V2 V7 p4 K使用sed删除匹配行的上一行和下一行
' [$ q/ {" u( T" N6 m 8 P  F1 N, K+ m) G" C- J' c
1.删除匹配行的上一行和下一行:% L" h2 p/ o- M) n# s  H9 H

! _6 t1 e$ }( I, ~# u/ j, Lsed -i -e '/string/{n;d}' -e '$!N;/\n.*string/!P;D' file
$ S/ o! p" f. R2 `2.sed中使用变量,删除匹配行的上一行和下一行:
1 {( v$ D4 Z& x2 Y% C* O# k8 Q" H
9 j: [) h" q& Q  y  h 5 k3 n7 r) v3 P" n$ e
AA=string #变量指定匹配字符串
% P" v' I) m2 o" D/ s) o! V3 z4 K( }   d0 g; }* K, x! T
sed -i -e '/'"$AA"'$/{n;d}' -e '$!N;/\n.*'"$AA"'$/!P;D' file9 |: @3 w  S& p6 ?8 [0 }

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', '超时未领完');2 w3 k0 P6 X( i" z; d* ?0 f; k
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', '超时未领完');; |2 S  Z2 C! K9 |) m' \
--
1 ~, s/ a; T! E: P; K3 i+ @+ S  BONUSID number(11) ,3 H. w9 r. z) q: i6 G$ ?- Y4 u
  DELETEFLAG number(2) ,) v$ \( F/ W7 T& X# g* ^5 _9 `
  TYPE number(2) ,3 _6 @8 J' P  ^7 V
);

" E. r4 k* K5 }6 L+ s- W
CREATE TABLE bonususer (8 K9 |) ~# S; s/ D; }
--2 G- x4 g0 _. H, t* m
  SENDUSERID number(11) ,
8 ]( B' K1 v- ^8 X3 [8 h  SENDUSERNAME varchar2(32) ,3 f+ h& d5 ~7 m
  BONUSTICKETNO varchar2(32) ,$ \/ Z& U( }$ `8 O$ N
);

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');
) y3 m" |* _1 vINSERT 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');1 V7 J, Z8 _# N; c& @, ~; S& r
--
$ t! C# B$ T' f; M  receiveUserId number(11) NOT NULL,$ e0 v, Z2 X2 B! p* w
  deleteFlag number(1) NOT NULL ,9 X( Q5 W; \% E; \9 C
  createTime date ,) U' \3 V: Y0 U9 u
);

INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');9 m4 X0 X* z" u$ v4 D) x2 L' X
INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');- M8 q- D% a1 I" C! m# L# i) q

要求:3 S- Z8 h" Y( T1 n
使用sed删除以)开头的行的上一行末尾的逗号
+ I5 {& k. a1 J7 Q, R苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。

答案:
4 D% g: j; s8 n8 A[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file+ J6 I- L9 p8 |) E9 p
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');6 A: k6 L( K# t6 b5 f  N
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', '超时未领完');/ R+ x6 P" Z/ L# _# R; o
--" G6 g( n1 H/ p: y& g- ~6 l
  BONUSID number(11) ,& k* V: e3 c; q, k( P% [; Z1 M
  DELETEFLAG number(2) ,; W) B; W) u0 i" @0 w& u
  TYPE number(2)
7 w( j# ]( c, c, ?  [0 [);


# b9 o) v+ B7 _5 XCREATE TABLE bonususer (1 C* x; a7 `, p) L8 Z4 `
--0 E7 Y# N2 x8 d! I
  SENDUSERID number(11) ,. P0 U1 ~4 y% b4 q8 D
  SENDUSERNAME varchar2(32) ,
" B1 m- q  C* E3 H- o0 l+ `0 \  BONUSTICKETNO varchar2(32)
1 K( q- X: _' x! j  q2 [);

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');
% @$ N6 m9 i5 N! a- J6 Q2 yINSERT 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');: ?. j9 y# C9 R5 ~8 _9 c4 T- f0 Z
--
+ G( Q" F: L5 n6 m2 u  receiveUserId number(11) NOT NULL,
$ ^% o$ J& R( Z2 i  deleteFlag number(1) NOT NULL ,! [' V, F3 q1 s# }% i4 \( t1 Z8 b
  createTime date
$ M& W; z! q5 x0 h( B);

INSERT INTO rb_bon
" V/ H# n$ k+ \0 e" u1 @' n6 N% x+ [0 Y4 {! u
解释:
$ K4 Z3 \( Y6 z1 u7 i\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
4 h& c1 X; y& b" N' \5 [\s*就是有0到n个空格或\n) P% w- b" j( i- p3 ^) \
/,/{}只要找到“,”就执行{}里的语句/ N# D  H9 x8 a7 `4 Q! W
:loop就是个标识,bloop 就是跳转到:loop
5 V8 D6 k8 E# r" C; gN是把下一行加入模式空间
1 E! w8 q* y$ N8 _/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
7 j& W3 x* |  h# x7 \1 o/ `s/,\s*)/\n)/ 就是去掉“,”号
5 k0 k6 o1 o5 Y+ V% B6 V' X

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

本版积分规则

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

GMT+8, 2026-6-12 02:10 , Processed in 0.019049 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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