admin 发表于 2021-10-25 11:20:01

sed 加参数删除字符所在行

# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
DEVICE=bond1.36
NAME=bond1.36
BOOTPROTO=static
ONBOOT=yes
IPADDR=172.16.6.20
NETMASK=255.255.255.0
GATEWAY=172.16.6.254
DNS1=10.17.1.1
VLAN=yes
NM_CONTROLLED=no

# sed -i '/'"DNS1"'/d' /etc/sysconfig/network-scripts/ifcfg-bond1.36

# cat /etc/sysconfig/network-scripts/ifcfg-bond1.36
DEVICE=bond1.36
NAME=bond1.36
BOOTPROTO=static
ONBOOT=yes
IPADDR=172.16.6.20
NETMASK=255.255.255.0
GATEWAY=172.16.6.254
VLAN=yes
NM_CONTROLLED=no

sed命令常用到的两个选项:
-i : 直接在文件上编辑 (edit files in place)
-e[默认选项]:只在命令行输出,而文件不改变
(add the script to the commands to be executed)
注:使用sed命令可以使用 -i 或者 -e 选项(以下例子仅以-i举例)sed命令删除特定行号
删除第N行
sed -i 'Nd' filename

删除第N~M行
sed -i 'N,Md' filename # file的行都被删除

删除shell变量表示的行号(配合for等语句使用)
sed -i "${var1},${var2}d" filename # 这里引号必须为双引号

删除最后一行
sed -i '$d' filename
sed命令删除包含特定字符行
删除包含"xxx"的行
sed -i '/xxx/d' filename

admin 发表于 2021-10-25 11:20:27

sed删掉某一特定字符的行


sed -i '/关键字符/d' 文件名
下面为去掉含变量情况
sed -i '/'"$mm"'/d'11.txt

使用sed删除匹配行的上一行和下一行

1.删除匹配行的上一行和下一行:

sed -i -e '/string/{n;d}' -e '$!N;/\n.*string/!P;D' file
2.sed中使用变量,删除匹配行的上一行和下一行:


AA=string #变量指定匹配字符串

sed -i -e '/'"$AA"'$/{n;d}' -e '$!N;/\n.*'"$AA"'$/!P;D' file

admin 发表于 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', '超时未领完');
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', '超时未领完');
--
BONUSID number(11) ,
DELETEFLAG number(2) ,
TYPE number(2) ,
);
CREATE TABLE bonususer (
--
SENDUSERID number(11) ,
SENDUSERNAME varchar2(32) ,
BONUSTICKETNO varchar2(32) ,
); 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');
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');
--
receiveUserId number(11) NOT NULL,
deleteFlag number(1) NOT NULL ,
createTime date ,
); INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');
INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');
要求:
使用sed删除以)开头的行的上一行末尾的逗号
苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。答案:
$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
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', '超时未领完');
--
BONUSID number(11) ,
DELETEFLAG number(2) ,
TYPE number(2)
);
CREATE TABLE bonususer (
--
SENDUSERID number(11) ,
SENDUSERNAME varchar2(32) ,
BONUSTICKETNO varchar2(32)
); 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');
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');
--
receiveUserId number(11) NOT NULL,
deleteFlag number(1) NOT NULL ,
createTime date
); INSERT INTO rb_bon

解释:
\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
\s*就是有0到n个空格或\n
/,/{}只要找到“,”就执行{}里的语句
:loop就是个标识,bloop 就是跳转到:loop
N是把下一行加入模式空间
/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
s/,\s*)/\n)/ 就是去掉“,”号
页: [1]
查看完整版本: sed 加参数删除字符所在行