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

sed 加参数删除字符所在行

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-10-25 11:20:01 | 显示全部楼层 |阅读模式
[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
/ K7 d# ?7 n8 iDEVICE=bond1.36
% _4 _8 K1 O# N* kNAME=bond1.36) D) j9 i& G! H
BOOTPROTO=static
7 W( U$ W% Y4 {% qONBOOT=yes, A9 k! e, n+ d" |, t  Q# O
IPADDR=172.16.6.20, X' b) g3 [3 g& Q4 V
NETMASK=255.255.255.0
* Z% d* t+ G5 M9 Q$ n  h+ e4 DGATEWAY=172.16.6.254
  L4 c& d$ g2 w1 uDNS1=10.17.1.1
+ v1 P2 q3 J, w2 L7 s, q$ nVLAN=yes1 R* f3 i& v& ~9 x6 q
NM_CONTROLLED=no, K4 I& ?, o) L6 w

0 O( {1 J6 w* k( V: m. U4 O( h[root@compute10 ~]# sed -i '/'"DNS1"'/d' /etc/sysconfig/network-scripts/ifcfg-bond1.36: m- H1 G) _0 T& V

1 b. }1 t7 \3 m8 S. C[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36 * y. S; _/ D. P' P( G. B2 U
DEVICE=bond1.36
$ c- \* ^$ ?: Z# W3 x, T% mNAME=bond1.36
9 C, \) w! r0 s8 u$ l  O" A$ TBOOTPROTO=static! v# _' [  z/ O: Q  H3 G% }
ONBOOT=yes
. o6 Y' N4 n0 A. v  P) \4 e, B: O; [IPADDR=172.16.6.20  V3 P9 y1 {; M0 w2 ]/ c
NETMASK=255.255.255.0
" O3 f0 |7 d# V, c+ I; K+ lGATEWAY=172.16.6.254+ }$ h% a+ s8 t8 I8 |$ G
VLAN=yes3 D9 |; |* \3 G3 Q- z' }
NM_CONTROLLED=no' u2 X! n; f' [7 q. N- i# f
7 [8 h- w" h, d6 M4 N4 n+ q  x6 n4 T2 J
sed命令常用到的两个选项:1 t! A5 y0 o5 G$ ^. Y' f0 S( T
-i : 直接在文件上编辑 (edit files in place)1 b- L; v9 }0 Z1 n0 e
-e[默认选项]:只在命令行输出,而文件不改变+ c; U* r* @2 S! M  M
(add the script to the commands to be executed)+ R2 W) V5 V+ A: H7 |/ W& k: ~- g
注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)
sed命令删除特定行号
' c9 ^) @0 n# Y7 {* x删除第N行  I6 g! z# D! R- p) @$ s
sed -i 'Nd' filename" U$ q  I4 Y0 a

5 R+ l1 y* L+ R! o+ l! \删除第N~M行8 T4 B8 s# {/ k8 w5 M8 S
sed -i 'N,Md' filename # file的[N,M]行都被删除
# C( g# Z/ f; C, \+ n" X2 n+ n( W# Z9 D
删除shell变量表示的行号(配合for等语句使用)1 C: Q" x/ Y" @0 @, |
sed -i "${var1},${var2}d" filename # 这里引号必须为双引号
* a3 B9 o2 W$ x! k7 C! n" k6 }" Z/ C. U. [2 N2 E
删除最后一行
# [5 }& p% h/ nsed -i '$d' filename

: {3 M/ }4 B  ~1 T9 \sed命令删除包含特定字符行
2 E+ l6 h1 C  q: k% X删除包含"xxx"的行
% B8 i4 A5 M' Z- Q+ Ksed -i '/xxx/d' filename

6 J* A  @* Z' Y* c! T/ M

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-10-25 11:20:27 | 显示全部楼层
sed删掉某一特定字符的行
( D9 \) c2 i; C0 J 8 S3 u! ?7 I7 b/ I5 R) d4 b

  D1 k7 o9 L3 r3 F- gsed -i '/关键字符/d' 文件名: Q5 A# x( K5 y9 E2 K# x
下面为去掉含变量情况
0 C3 B7 y6 m* R  nsed -i '/'"$mm"'/d'  11.txt
- M: s+ P4 b' J* S7 Q0 S  L3 `
, Z$ @! k  E$ [$ O使用sed删除匹配行的上一行和下一行  ?2 j$ Y- m. D7 F( v; G1 Z2 W

# o+ h* u/ n3 `. m, N. ]& R0 b* F1.删除匹配行的上一行和下一行:
/ o0 c7 Q2 c) j2 c/ F$ h; a' d" }1 D9 e3 J7 W
sed -i -e '/string/{n;d}' -e '$!N;/\n.*string/!P;D' file6 a/ K% q1 P0 s$ f6 p1 W7 `
2.sed中使用变量,删除匹配行的上一行和下一行:2 ]  T; L) t1 c9 ~" l

+ C2 W: X! R& Z' a: I+ \
: _+ Z" X) z# R+ S2 oAA=string #变量指定匹配字符串' E; R! [" ]6 X
# x4 s8 q: L3 u; y/ _
sed -i -e '/'"$AA"'$/{n;d}' -e '$!N;/\n.*'"$AA"'$/!P;D' file
6 H  S  p1 U3 ?4 z, z6 z' R3 j: d

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', '超时未领完');) e6 J1 U1 J! \0 S: O" z
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', '超时未领完');6 ^% ?: Z) W3 v9 F8 A: |
--, p, I2 B! {7 u6 q: V: ?$ n; x) y
  BONUSID number(11) ,8 |, F; f* s7 d: Q* t7 @5 }
  DELETEFLAG number(2) ,2 t6 ?! S) h: B8 Z- u2 v( ^
  TYPE number(2) ,
0 y5 w! e2 Z& ]' @4 g7 });


& O  r/ D9 |& y- z# lCREATE TABLE bonususer (+ Y9 G$ ^7 u: e% g" b4 Z7 ~# b
--4 v) C5 }, x: u( d
  SENDUSERID number(11) ,
" J; k+ A) N: P) ^  SENDUSERNAME varchar2(32) ,: V8 ~% i; [% m
  BONUSTICKETNO varchar2(32) ,
4 q2 o$ m7 E2 s0 x/ b6 @5 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');- @3 S; p3 }5 n$ j, 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');; r: I; e! f" N' ?+ }' z- f
--
# ]. u  f* l: E4 p9 F$ \; `+ l  receiveUserId number(11) NOT NULL,6 U6 m$ b2 V8 G$ u! Z8 l- h7 ?+ Q
  deleteFlag number(1) NOT NULL ,
. W/ L1 u7 e7 L, b6 D1 Y- o3 o  createTime date ,6 `& j0 s3 D; n8 d; {$ e! S( v
);

INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');/ c6 o6 m8 u  E
INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');
' [5 P* e1 k' K. Y$ S

要求:# N* m" F9 {1 f: Z3 Q
使用sed删除以)开头的行的上一行末尾的逗号8 y3 D! x+ K( x( K
苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。

答案:/ b4 k7 w* z/ M5 H! w
[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file
) D2 x$ M8 v4 I: j/ h* _6 H20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');. Z8 b3 T  D5 a
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', '超时未领完');
' T" J! S2 T3 P--5 [: N5 ]7 K' N3 P& }
  BONUSID number(11) ,$ m( }! R3 a0 d# V9 V2 v9 f
  DELETEFLAG number(2) ,
5 I0 i7 D( E( ]' r% c  a: |  TYPE number(2) ) W( H+ w* x" K7 e. p! M
);


' s+ E. K% U! v9 `: A% X& DCREATE TABLE bonususer (
" n' q1 N6 z( c! {6 v/ s6 ]--+ @% f  Y( a- f$ z" ^; W( `
  SENDUSERID number(11) ,
0 |/ K% g2 ^  ^  SENDUSERNAME varchar2(32) ,9 t! f5 x8 ?" N: E6 a! X/ q
  BONUSTICKETNO varchar2(32) 0 V. \7 O( G5 v$ n. z" 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');
7 y3 E8 d. D% D( ]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 X2 ?' h( Q: A
--
+ g6 K" E; Z' S: }7 U  receiveUserId number(11) NOT NULL,
9 I2 f% `/ C7 n0 Q) l$ s% x8 R  deleteFlag number(1) NOT NULL ,2 x3 p. W, w7 A, e: j* Y5 h0 Z
  createTime date : a' t' [  L2 S+ m3 F2 D- d' z7 e
);

INSERT INTO rb_bon5 s- [3 N* N3 o, m( ?6 B
$ d9 n/ x! s# I2 d- D$ S
解释:* u4 d* s0 _" y
\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
! D- d& R2 |. ^  X% S; y\s*就是有0到n个空格或\n8 G- A1 h6 k2 v
/,/{}只要找到“,”就执行{}里的语句
0 A1 Z. R! o% _6 I$ L. A3 a:loop就是个标识,bloop 就是跳转到:loop
: C$ b! Z( s* Z2 IN是把下一行加入模式空间
9 S% q( Y* Z1 G. B/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
/ N0 @( F% @5 f: F7 o8 D& L2 v$ as/,\s*)/\n)/ 就是去掉“,”号
* L* r& V1 J/ I$ B$ }; Q+ S

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

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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