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

sed 加参数删除字符所在行

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-10-25 11:20:01 | 显示全部楼层 |阅读模式
[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
  b+ x9 `% g: f. l/ k0 f* SDEVICE=bond1.36 # `% S8 G7 F, k
NAME=bond1.36
$ Y; k5 w0 ]. y$ h" C  `# kBOOTPROTO=static, v; e" Y6 g0 _5 j# X5 k$ J
ONBOOT=yes0 `2 ]( A( s/ x' ^. j
IPADDR=172.16.6.20
7 S" w" s) i6 J6 f; ]NETMASK=255.255.255.0
9 c3 b$ j, v1 j. t7 wGATEWAY=172.16.6.254
! j' w2 C% X0 B) o5 v# F$ cDNS1=10.17.1.1
- `6 R6 W5 [3 ]- W- YVLAN=yes
; a( _2 ]; ^( PNM_CONTROLLED=no
; e, G. |' {3 M' @8 T! Z
$ K8 ^' H. e% V0 w. v. ^[root@compute10 ~]# sed -i '/'"DNS1"'/d' /etc/sysconfig/network-scripts/ifcfg-bond1.367 v  k' P3 Q! A

% G' O9 x9 ?: z$ n[root@compute10 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
6 i) Y( ]. `3 e" F, i( f# q8 P8 y% A, PDEVICE=bond1.36 8 K9 u( z( x! F8 x( y, l. O
NAME=bond1.36
9 K- C* J2 P  ], g& j6 jBOOTPROTO=static1 }  V2 \$ q, x. b4 K
ONBOOT=yes
* a0 f: Q4 ]3 A+ i/ UIPADDR=172.16.6.20
) T6 Q# p! L! `0 t# Q+ v/ G& jNETMASK=255.255.255.03 [& L; G& x! X! s  _7 }
GATEWAY=172.16.6.254" Y' F" @9 G7 K6 P, [/ F* |
VLAN=yes
4 z, n3 C8 B/ G$ v+ hNM_CONTROLLED=no0 P$ G  `3 t7 O5 ^3 ?5 G

0 K: [! Q8 S2 X7 T, e& [1 U1 w
sed命令常用到的两个选项:
/ ]( ~+ e3 T( j$ t-i : 直接在文件上编辑 (edit files in place)* H8 s2 O8 M( w0 j- ]0 V# b
-e[默认选项]:只在命令行输出,而文件不改变0 V0 ~. w  G% H1 H: I9 @% r% n
(add the script to the commands to be executed)
& k3 |  g6 A0 J  h. d注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)
sed命令删除特定行号
: B+ j% t+ B2 q' ~3 Q- [1 K删除第N行% L8 {: f# C) E% `# X& P
sed -i 'Nd' filename, `3 c8 S6 T/ p# q3 T& u

3 y4 w8 h) C, g9 U6 r$ R2 H  }5 \删除第N~M行7 j  v5 L) ^6 S9 f' N# ]6 N
sed -i 'N,Md' filename # file的[N,M]行都被删除2 L& A; a- L7 \

# S5 x' E+ p0 ^. ]删除shell变量表示的行号(配合for等语句使用)
7 d( G& {; X$ \' f. J" Qsed -i "${var1},${var2}d" filename # 这里引号必须为双引号7 R4 a& i9 L& V4 i# ~, Q

" k1 K( F8 F# w4 u/ g删除最后一行
8 {, W: u3 T4 Y9 Y* Q: fsed -i '$d' filename

( x! O% j$ {3 J4 Used命令删除包含特定字符行2 R# d2 _1 [0 c: V
删除包含"xxx"的行( v; s# E( u; D& g0 }
sed -i '/xxx/d' filename

  ~, p! j2 j* `% `" [

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-10-25 11:20:27 | 显示全部楼层
sed删掉某一特定字符的行
5 C. \" C$ ]" |# A
/ h2 r& K! i( [- A 8 C+ }2 Z: ^6 f9 j" H
sed -i '/关键字符/d' 文件名& V0 i! e. u1 Y4 Q
下面为去掉含变量情况. U: o( F- Q5 v$ i8 d6 D
sed -i '/'"$mm"'/d'  11.txt
. x- O2 D6 a. i; b+ e; \6 x6 k+ y) y% ]. G% e2 b* O
使用sed删除匹配行的上一行和下一行
6 V' S& q2 W! `4 z! d& K
$ ?' h& Y5 P% A+ r4 z1.删除匹配行的上一行和下一行:
% ]. t7 C# J: J. D# B0 G, L
/ u' H4 ~* s( J. ssed -i -e '/string/{n;d}' -e '$!N;/\n.*string/!P;D' file
3 g, X, ^5 j! S* D; I1 B2.sed中使用变量,删除匹配行的上一行和下一行:! Q8 j7 R2 N1 T
% j8 H3 w9 @8 `. g7 ^3 v" @9 j1 |

! \/ ~) u! A) u% I5 aAA=string #变量指定匹配字符串; z/ U: G* a% w7 X

3 x9 I" M  w% i4 \6 f3 Gsed -i -e '/'"$AA"'$/{n;d}' -e '$!N;/\n.*'"$AA"'$/!P;D' file6 W0 ^$ B) q' i/ ~& i, z

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', '超时未领完');. J- R& E9 e9 \" x
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', '超时未领完');
1 T/ j) Q! w, Z2 z--
% D0 H( h$ |* n4 O6 j# j  BONUSID number(11) ,6 d8 K+ m9 T! Y2 {/ J$ \' o0 D
  DELETEFLAG number(2) ,
- A" O2 [. W5 d, s  TYPE number(2) ,
% R+ d# U* F% ^0 L);


7 ?$ ^; [6 s3 v; B) ?% I% k1 n! PCREATE TABLE bonususer (/ C& |3 }9 E- U2 c* s" s$ b
--
- U. Z+ T7 t0 {* v  SENDUSERID number(11) ,; X3 ^, P# \* L- b* Z
  SENDUSERNAME varchar2(32) ,
3 c+ E! d( K0 p9 s  BONUSTICKETNO varchar2(32) ,. Z5 e2 W- U, f8 m9 f. Y# P
);

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');
6 Q$ p  v$ ^( IINSERT 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 l- s% |) i0 [& @1 e! x--
6 P5 {) s& d3 r2 e' B0 u% g  z  receiveUserId number(11) NOT NULL,
) z& p( @2 W% s3 f* F/ v8 g  deleteFlag number(1) NOT NULL ,
5 u9 w$ y; V7 j. G  createTime date ,8 G9 ~4 l# Y, B3 H$ r9 U. _
);

INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');
/ a& U' B1 U/ k& O$ GINSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');' [: C5 a3 [% @+ v3 M  F

要求:' |0 |% z) Y5 a+ ]3 `( n" s
使用sed删除以)开头的行的上一行末尾的逗号
8 J, h0 s' U1 X# s! p苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。

答案:
) L, ]# l9 p( w1 `  Y; ?) i* Y[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file  e# L0 W  ]& V7 W$ W
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
/ ^' H9 T7 ?8 ]1 @( `: hINSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');' W3 f. H5 g7 f% r
--, T! \; a8 ~- _6 Q' P" M3 T3 A
  BONUSID number(11) ,
7 H) R8 F7 q# y. I( E; l; q  DELETEFLAG number(2) ,+ n. ?/ C8 B  z8 M1 p
  TYPE number(2)
6 k  T+ e- E7 S0 W3 C* S2 }9 S4 K);


5 |7 ?/ e$ ^6 TCREATE TABLE bonususer (0 Z" o# `/ I9 |- N% B: @. F
--
2 A  Y+ D, u% \. S: e0 X% q  SENDUSERID number(11) ,
# I3 I0 L# `. X, e5 g: A  SENDUSERNAME varchar2(32) ,
$ d5 A. S/ ~" ]/ m$ B+ x# ?  BONUSTICKETNO varchar2(32)
) K& ~% @2 t# 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');- e3 M. Q0 E) E; z% B
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');
5 Q8 ~5 y; r! I/ t7 ^--! k1 @; ~6 ?' P5 G7 J6 J3 X% f
  receiveUserId number(11) NOT NULL,
& [$ O  _4 z* @; H: S) n, B  deleteFlag number(1) NOT NULL ,
& Z3 u2 K6 _( b9 a8 A6 I, \  createTime date
; V5 N; `* Y5 N4 F! K);

INSERT INTO rb_bon
8 J$ Q. W: m. H) T
$ ]4 s" p% ~# {6 O( t解释:
% ?$ U. t# N) d! R0 r: d( P* i\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
2 v" @- _3 {7 o- S" u0 \\s*就是有0到n个空格或\n4 `0 M: O! f, k6 y6 W. n
/,/{}只要找到“,”就执行{}里的语句
, L! n3 |0 Y% N$ k5 {% N1 Z3 ~:loop就是个标识,bloop 就是跳转到:loop
$ m% a! d/ h2 S; C6 O! A8 z  \4 |2 JN是把下一行加入模式空间
' S5 u( }6 f/ x/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句, M# S  l8 n1 z( _; f  Z
s/,\s*)/\n)/ 就是去掉“,”号
9 d8 |* ^5 i4 e

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

本版积分规则

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

GMT+8, 2026-6-12 05:31 , Processed in 0.016017 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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