sed中的N,P,D

N 把匹配的行写入保持空间,可个觉得可以理解为把匹配到的行写入一个新的文件中,这样会比较好理解,行与行之前用以用.*匹配到"\n",或者是直接用"\n"直接      进行匹配,平时在模式空间(可能理解为你要处理的文字,如你是一个file里面的文字),".* "是不能匹配到"\n"的

P 大写p,把模式空间中匹配到的行写入到保持空间,但只输出匹配到的行或者是部分,即成功匹配到两行,但只输出第一行

D 道理跟P相似,把匹配到的,模式空间的行写入保持空间,但只删匹配到的部分,不删匹配到的第二行或者是部分,即成功匹配到两行,但只删除第一行

个人觉得,P与D是相反的,第一打印出第一行,一个打印出第二行(在只匹配两行的情况下)

结合例子说明,下面的file内容,如果直接复制到linux的文件里有,行与行之间是有一个空行的,可以sed -i ‘/^$/d‘  file去空行

#cat file

abc1

defg1

abc2

defg2

abc3

defg3

abc4

abc5

defg4

1.打印出第一行有abc,第二行有defg的第一行,总共匹配两行,如果成功匹配到这两行,就只打印出第一行

#sed -n ‘/abc/ {N;/abc.*defg/p}‘ file

abc1
abc2
abc3

这里注意了,最后面三行,并没有匹配出来,这很奇怪,后面再讲

2.删除第一行有abc,第二行有defg中的第一行,总共匹配两行,如果成功匹配到这两行,就打印出第二行

#sed   ‘/abc/ {N;/abc.*defg/D}‘ file

defg1
defg2
defg3
abc4
abc5
defg4

还是很奇怪吧,第四和第五行又出来了,如果要让他们不出来,下面再来讲讲

一般无论是P还是D,都只匹配到倒数第二个能匹配到的,如果想要最后一个都能匹配到,就得把N , P , D结合起来用

3.还是跟1.的要求一样,不过这次要求abc5也要出来

#sed -n ‘/abc/{N;/abc.*defg/P;D}‘ file

abc1
abc2
abc3
abc5

这样,就符合之前的要求,一般这三个可以做一个循环,以致不会把最后一个符合要求的给漏掉

sed中的N,P,D

时间: 2024-11-06 17:14:36

sed中的N,P,D的相关文章

sed修炼系列(四):sed中的疑难杂症

本文目录:1 sed中使用变量和变量替换的问题2 反向引用失效问题3 "-i"选项的文件保存问题4 贪婪匹配问题5 sed命令"a"和"N"的纠葛 1.sed中使用变量和变量替换的问题 在脚本中使用sed的时候,很可能需要在sed中引用shell变量,甚至想在sed命令行中使用变量替换.也许很多人都遇到过这个问题,但引号却死活调试不出正确的位置.其实这不是sed的问题,而是shell的特性.搞懂sed如何解决引号的问题,对理解shell引号问题有

sed中变量的使用方法

一般在sed 中替换都用单引号,如下边sed -in-place 's/8080/8001/g' /home/work/server.xml但是如果需要把8001改成变量,如sed -in-place 's/8080/$port/g' /home/work/server.xml这样就不成功.此时需要把单引号改成双引号,如下边例子$port=8001sed -in-place "s/8080/$port/g" /home/work/server.xml

sed中引入shell变量

sed中引入shell变量的四种方法1.eval sed 's/$a/$b/' filename2.sed "s/$a/$b/" filename3.sed 's/'$a'/'$b'/' filename 4.sed s/$a/$b/ filename

sed中的多行匹配

sed中的多行匹配,可以用N,N的意思是把下一行写入保持空间,保持空间可能不好理解,可以理解为机器的内存一样,把一下行也写入内存,可能会好理解多了,当把一下行也写入保持空间的时间,转行符"\n",也可以用.*匹配到了,前几天在帮开发做全局替换,在一对php标签中,替换里面的两行内容,其他有两个字段组合起来就是整个页面都是唯一的 <?php $_web = str_replace(array('s-','www.'),'',$_web);\$_webcontents = file_

关于sed中的Pattern Space和Hold Space的随笔

首先是一部分概念和示例,这部分转自:http://coolshell.cn/articles/9104.html Pattern Space 第零个是关于-n参数的,大家也许没看懂,没关系,我们来看一下sed处理文本的伪代码,并了解一下Pattern Space的概念: foreach line in file { //放入把行Pattern_Space Pattern_Space <= line; // 对每个pattern space执行sed命令 Pattern_Space <= EXE

sed 中如何替换换行符

使用如下解决方案: sed ':a;N;$!ba;s/\n/ /g' 这将在一个循环里读取整个文件,然后将换行符替换成一个空格. 说明: 通过 :a创建一个标记 通过N追加当前行和下一行到模式区域 如果处于最后一行前,跳转到之前的标记处. $!ba ($! 意思是不在最后一行做这操作 (最后一行就被当成最后的一行)). 最后置换操作把模式区域(就是整个文件)的每一个换行符换成一个空格. 示例追加: $ echo -e "1\n2" | sed ':a;N;$!ba;s/\n/ /g'1

Linux中的sed命令

sed - stream editor for filtering and transforming text 流编辑器的过滤和转换文本 sed [-nerf] [动作] 参数: -i 修改源文件 危险 -e 直接在命令行模式上执行sed的动作编辑 -f 直接将sed的动作写在一个文件内,-f filename 则可以执行filename内的sed动作 -r :使用扩展的正则表达式 -n 静默模式,默认的sed中所有来自stdin的数据一般都会被列出到屏幕上,但如果加上-n之后,则只有经过sed

简述linux中sed命令

sed命令:Stream EDitor 流编辑器 sed命令的工作流程: sed会复制原文件中的一行或者多行,逐行进行操作.首先会将该行的内容放入到模式空间内,在模式空间内进行定界或者正则表达式匹配操作. a.如果该行内容不符合正则表达式或定界,该内容则被判断为No,进行标准输出. b.如果该行内容符合正则表达式或定界,该内容则被判断为Yes,进行编辑(包括标准输出). sed中模式空间和保持空间中的内容会进行会换,这种会换会使文件内容进行多次的筛选编辑,完成复杂的任务.   一般情况下,sed

如何使用sed在文件中确定行插入带有变量的字符串

背景 最近在研究一键部署,其中有一个环节,是要使用shell脚本放开防火墙的某个端口号 方法 使用shell中常见的插入文本命令:sed 问题 如果已经预知要打开的端口号如6379,可以使用:sed -i '10a\-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT' /etc/sysconfig/iptables 来实现 但是目前的端口号为未知变量$port,如果使用:sed -i '10a\-A INPUT -