sed 川长思鸟来 2022-10-02 10:48 128阅读 0赞 \[root@localhost ~\]\# cat 3 difsdf fsd dfs \[root@localhost ~\]\# sed 's/fs/aa/' 3 diaadf aad daa \[root@localhost ~\]\# sed '/fs/c\\aa' 3 aa aa aa sed 's/fs/aa/' 3是部分替换 sed '/fs/c\\aa' 3是正行替换 ———————————————————————— n 读入下一行 N 添加下一行到pattern space \[root@localhost ~\]\# cat 3 difsdf cbaa23 123 fsd fgdaaa23f dfs \[root@localhost ~\]\# sed -e '/fs/\{c\\CC' -e '\}' 3 CC cbaa23 123 CC fgdaaa23f CC \[root@localhost ~\]\# sed -e '/fs/\{n;c\\CC' -e '\}' 3 difsdf CC 123 fsd CC dfs \[root@localhost ~\]\# sed -e '/fs/\{N;c\\CC' -e '\}' 3 CC 123 CC dfs \[root@localhost ~\]\# sed -e '/fs/N' -e '//cCC' 3 CC 123 CC dfs \[root@localhost ~\]\# sed -e '/fs/N' -e '/fs/cCC' 3 CC 123 CC dfs —————————————————————————————————— $ cat IP.txt a.net:192.168.0.1:5s b.net:192.168.0.5:7s e.net:192.168.1.3:8s z.net:192.168.4.9:1s c.net:192.168.0.9:9s 用命令:sed '/^z\\.net/s/:\[^:\]\\+/:192.168.0.19/',可以把ip.txt文件中的z.net行第2列修改为192.168.0.19 —————————————————————————————————— 在每行的头添加字符,比如"HEAD",命令如下: sed 's/^/HEAD&/g' test.file 在每行的行尾添加字符,比如“TAIL”,命令如下: sed 's/$/&TAIL/g' test.file Unix系统里,每行结尾只有“<换行>”,即“\\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\\n\\r”。一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号。 好了,所以我的问题就出在被处理的文件的每行末尾都有^M符号,而这通常是看不出来的。可以用"cat -A test.file"命令查看。因此当我想在行尾添加字符的时候,它总是添加在行首且会覆盖掉原来行首的字符。 要把文件转换一下,有两种方法: 1.命令dos2unix test.file 2.去掉"\\r" ,用命令sed -i 's/\\r//' test.file ——————————————————————————————————— \[root@localhost ~\]\# cat urfile \# 1 2 3 \[root@localhost ~\]\# sed ':a;$!N;/\#/!s/\\n//;ta;P;D' urfile \# 123 大致可以拆分为3个阶段: \# 1 2 3 \--> \#\\n1 2\\n3 分析: 1. (经过N处理过的输出和原文件没有区别,但是本质是不一样的,我这里为了方便表述,把隐藏的\\n写到了同一行) 2. (读入第一个pattern space /\#/,$!成立,执行N命令,创建多行模式空间,结果如上所示) 3. (紧接着,读入pattern space /\#\\n1/,/\#/!条件不成立,不执行s/\\n//,跳过ta,执行P,打印”\#“,执行D,删除"\#\\n",pattern space内容为/1/) 4. (随后,读入pattern space /1\\n2/,/\#/!条件成立,执行s/\\n//,跳转到:a,进入循环,pattern space内容为/1 2/) \--> \# 1 2\\n3 分析: 1. (注意,这里的\#的输出是P和D作用的结果,参照第一步) 2. (因为D命令执行成功后会使得控制流跳到脚本的第一条语句,这里,也即跳到了:a处,也即进入了一个新的循环) 3. (新的循环开始,从:a开始执行。注意:不是读入下一行开始,从:a开始执行,所以当前的行号是2,也就说$!永远成立,这也就说明了N前面加不加$!都是可以,效果一样。) \--> \# 1 2 3 分析: (这里之所以输出1 2 3,不是因为执行了后面的P和D,而是因为当s/\\n//执行成功后跳转到了标签a处,又因为N没有下一行可读了,所以就exit了,不再执行后面的命令 (这里说明退出循环是N的作用),这时候pattern space的内容是/1 2 3/,因此就被输出到了标准输出上。(这也间接说明了加了-n后1 2 3就被抑制输出了)) 完毕…… ————————————————————————————————————— 获取ip ifconfig eth0 | grep 'inet ' | sed 's/^.\*addr://g' | / ifconfig eth0 | grep "inet addr" | awk '\{print $2\}' | cut -f2 -d':' ifconfig eth0|grep -Po '(?<=r:).\*(?= \*B)' ifconfig eth0| awk -F '\[ :\]+' '/inet addr:/\{print $4\}' 如果是用sed来取IP地址的话,我的个人习惯会写成这样。 复制内容到剪贴板 代码: ifconfig eth0|sed -rn '/Mask/s/\[^:\]+:(\[^ \]+).\*/\\1/p' 简单解释一下这条sed 1、参数rn r是为了让sed支持扩展正则也就是ERE(还有BRE、PRE这些不同的流派对于正则里元字符的表达方式都有不同,楼主可以自己Google就不在这里解释了),这样可以省去后边正则中的N多转义符号,比如说不加r的时候()必须要写成\\(\\)。 n是不要自动打印空间模式,加上他就只打印匹配的行才会去执行p的打印动作了。 2、/Mask/ 找ifconfig后匹配Mask这个字符串的行,这个纯属找规律。为什么不写inet,因为某些系统可能没有关闭ipv6,如果以inet为过滤条件的话,那可能结果就不是一行而是两行了。 3、s///p 这是标准的sed替换打印模式,这个应该是最基本的入门知识了。实际的意思就是“替换/源/目标/然后打印结果” 4、正则部分 为了方便解释,我把ip地址那一行先全部写出来 复制内容到剪贴板 代码: inet addr:192.168.5.182 Bcast:192.168.5.255 Mask:255.255.255.0 4.1对应这一整行字符串,正则的第一部分是要去掉从开头一直到addr: \[^:\]+在正则中\[\]是个字符串的集合,在\[\]中的^是非,^:就是非冒号的字符,紧跟后边的+代表1个或N多个整数字符,套到上边那行,来理解就不难了。先开始是空格,然后是i然后是n然后e一直匹配到r这些字符统统都不是:所以这第一部分正则时间代表的是“从行首开始N个空格然后是inet addr” 4.2后边紧跟着一个:,这个冒号就是匹配addr和192之间的那个冒号没什么可解释的。 4.3紧接着就应该取IP地址了 (\[^ \]+)刚刚讲过\[^\]非x字符,这里跟刚才还是一样的,非空格加+其实就是匹配到了5.182的最后一个2,因为2之后就是空格了,不在这个正则匹配范围之内了。加个()是为了sed后边的\\1,刚刚上边讲的“/源/目标/”这种模式中,源可以写成多个()表示的集合,第一个集合在目标中就用\\1表示,第二个就是\\2其他依次类推。 4.4最后的.\*是从182之后的第一个空格一直到行尾的255.0的那个0 总结一下,最开始的\[^:\]+:匹配了IP地址之前的所有字符,后边的.\*匹配了IP地址之后的所有字符,而中间括号里的\[^ \]+正好匹配了所有IP地址字符,再配合上后边的\\1,就实现了仅仅取得IP地址的目的。 ——————————————————————————————————— 统计连续的空格数量 \[root@localhost ~\]\# cat test1 inet addr:192.168.1.105 Bcast:192.168.1.255 Mask:255.255.255.0 \[root@localhost ~\]\# sed '/^\[ \]/s/\[ \]/+/g' test1 |cut -d i -f1 \++++++++++ \[root@localhost ~\]\# sed -n 's/\[ \]/+/gp' test1|cut -d i -f1|tr -d "\\n"|wc -L 10 \[root@localhost ~\]\# sed -n 's/\[ \]/+/gp' test1|cut -d i -f1|sed 's/./&\\n/g' \+ \+ \+ \+ \+ \+ \+ \+ \+ \+ 转载于:https://blog.51cto.com/dragonball/1282774
相关 sed \[root@localhost ~\]\ cat 3 difsdf fsd dfs \[root@localhost ~\]\ sed 's/fs/aa/' 川长思鸟来/ 2022年10月02日 10:48/ 0 赞/ 129 阅读
相关 sed 替换 转自:http://blog.csdn.net/mypwb/article/details/5832732 让我们看一下 sed 最有用的命令之一,替换命令。使用该 偏执的太偏执、/ 2022年08月25日 01:50/ 0 赞/ 202 阅读
相关 Sed简介 Sed简介 sed是一款轻量级流编辑器,是stream editor的简写。由于sed是以行为单位进行编辑文件 , 因此也称为行编辑器。它无需直接编辑资料,能够将编辑工作自 缺乏、安全感/ 2022年08月10日 09:23/ 0 赞/ 153 阅读
相关 sed 目录 简介 1 调用方式 2 选项 2 命令集合 2 寻址 3 基本用法 4 文件读入写出 5 附加-插入-修改文本 5 删除文本 6 ゞ 浴缸里的玫瑰/ 2022年08月06日 15:29/ 0 赞/ 146 阅读
相关 sed命令 sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern spa 深碍√TFBOYSˉ_/ 2022年06月01日 08:06/ 0 赞/ 247 阅读
相关 sed sed sed与grep比较,sed能实现grep功能,但是比较麻烦,而且没有颜色显示;sed优势在于替换一些指定的字符。 用sed实现grep匹配的功能,匹配关键词用 ╰半橙微兮°/ 2022年05月26日 06:51/ 0 赞/ 131 阅读
相关 sed stream editor 文件或命令行获取一行文本,进行处理输出,不修改原始文本 从命令行读取是输入一行,处理一行,再输入一行(这就是第二行),结束Ctrl+D(发送 r囧r小猫/ 2022年04月24日 13:30/ 0 赞/ 168 阅读
相关 sed命令 sed -i 's\a\b\g' test.txt 将test.txt中a替换为b,s为替换,g为全局替换 转载于:https://www.cnblogs.com/z 港控/mmm°/ 2021年11月22日 20:38/ 0 赞/ 294 阅读
相关 Sed命令 脚本命令如果不经常使用,那么很容易忘记,所以这里记录下,经常使用到的一些脚本命令。忘记的时候,看下笔记也能够快速捡起来 1.Sed命令语法 sed \[options\ 小咪咪/ 2021年11月09日 12:36/ 0 赞/ 492 阅读
相关 sed 命令 sed 是一种在线编辑器,主要用来自动编辑一个或多个文件。 工作原理:sed一次处理一行内容,处理时把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern spa 青旅半醒/ 2021年06月22日 15:37/ 0 赞/ 452 阅读
还没有评论,来说两句吧...