Linux学习----文本三剑客——sed(马哥教育原创)

我以前的文章介绍过grep了,今天我就来说一下第二个sed,它是stream editor的缩写。在Linux的文本文件中文本存储都是一行,显示时表现的多行其实都是因为有换行符的存在,例如:文本是:abc$def$ghi 显示出来就是三行了。Sed就是一个行编辑器,它一次读一行文本进行操作,然后根据我们的选择看是否同步到文本之中。还有一个叫awk的,在Linux上叫做gawk(gnu awk),它是一个文本格式化工具,我们下一篇文章再说。 工作机制:每次读取一行文本至“模式空间(pattern space)”中,在模式空间中完成处理;将处理结果输出至标准输出设备; 语法:sed [OPTION]... {script} [input-file]... -r: 支持扩展正则表达式; -n: 静默模式; -e script1 -e script2 -e script3:指定多脚本运行; -f /path/to/script_file:从指定的文件中读取脚本并运行; -i: 直接修改源文件; 地址定界: #: 指定行; $: 最后一行; /regexp/:任何能够被regexp所匹配到的行;sed ‘/^#/d’ /etc/fstab #删除以井号开头的行 \%regexp%:同上,只不过换作%为regexp边界符; /regexp/| :匹配时忽略字符大小写; \%regexp%| :匹配时忽略字符大小写; startline,endline: #,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行; #,# /regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行; #,+|-n:从#行开始,一直到向下的n行; first~step:指定起始行,以及步长; sed的编辑命令 d: 删除模式空间中的行;sed ‘1,2d’ /etc/fstab =:显示行号;sed ‘/^#/=’ /etc/fstab #显示以#号开头的行的行号 a \text:附加text;sed ‘/^#/a \new line’ /etc/fstab #在以井号开头行的后面添加new line字样 sed ‘1a \new line\nsecond line\ntherid line’ #\n表示换行符 i \text:插入text,支持\n实现多行插入; c \text:用text替换匹配到的行;sed ‘/5,7/c \new txt’ #五到七行都替换成一个new txt sed ‘/^#/c \new txt’ /etc/fstab #只有井号开头的行都替换成new txt,不只一个 p: 打印模式空间中的行;sed ‘5,7p’ /etc/fstab #5-7行的内容显示两遍,使用-n才符合我们的期望 s/regexp/replacement/:替换由regexp所匹配到的内容为replacement; g: 全局替换; i: 不区分大小写 #sed ‘s/^#//g’ /etc/fstab w /path/to/somefile:把指定的内容另存至/path/to/somefile路径所指定的文件中; # sed ‘5,9w /tmp/test1.txt’ /etc/fstab #将fstab中的5-9行写到test1.txt中 r /path/from/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并; #sed ‘8r /etc/issue’ /etc/fstab #将issue的第8行之后的内容读进来放到fstab之前 练习: (1) 删除/boot/grub/grub.conf文件中所有行的行首的空白字符; sed 's/^[[:space:]]\+//' /boot/grub/grub.conf (2) 删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符; sed 's/^#[[:space:]]\+//' /etc/fstab (3) 把/etc/fstab文件的奇数行另存为/tmp/fstab.3; sed '1~2w /tmp/fstab.3' /etc/fstab (4) echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名; 取基名:echo "/etc/sysconfig/network-scripts/" | sed 's@^.*/\([^/]\+\)/\?$@\1@' 取路径名:echo "/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'Sed不仅有一个模式空间,还有一个保持空间,它可以帮助sed暂时存储一些东西以便后续的使用。 高级命令: h:用模式空间中的内容覆盖保持空间的内容; H:把模式空间中的内容追加至保持空间中内容的后面; g:从保持空间中取到其内容,并将其覆盖模式空间中的内容; G:从保持空间中取到其内容,并将其追加在模式空间中的内容的后面; x:把保持空间和模式空间中的进行交换; n:读取匹配到的行的下一行至模式空间;(会覆盖模式空间中的原有内容); N:读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面; d:删除模式空间中的内容; D:删除多行模式空间中的首行; 注意:命令功能可使用!取反;分号可用于分隔脚本; 示例: sed 'G' /etc/issue: 在文件中的每行后方添加空白行; sed '$!d' /etc/fstab:保留最后一行; sed '/^$/d;G' /etc/issue: 保证指定的文件每一行后方有且只有一个空白行; sed 'n;d' /etc/issue:保留奇数行; sed -n '1!G;h;$p' /etc/issue :全文倒叙显示 sed '$!N;$!D' /etc/issue:显示最后两行 sed命令: -e 'script' -e 'script' 'script;script;script' 与上一行模式相同 script script script -f /path/from/script 都是第一行的作用添加描述

我以前的文章介绍过grep了,今天我就来说一下第二个sed,它是stream editor的缩写。在Linux的文本文件中文本存储都是一行,显示时表现的多行其实都是因为有换行符的存在,例如:文本是:abc$def$ghi 显示出来就是三行了。Sed就是一个行编辑器,它一次读一行文本进行操作,然后根据我们的选择看是否同步到文本之中。还有一个叫awk的,在Linux上叫做gawk(gnu awk),它是一个文本格式化工具,我们下一篇文章再说。

工作机制:每次读取一行文本至“模式空间(pattern space)”中,在模式空间中完成处理;将处理结果输出至标准输出设备;

语法:sed [OPTION]... {script} [input-file]...

-r: 支持扩展正则表达式;

-n: 静默模式;

-e script1 -e script2 -e script3:指定多脚本运行;

-f /path/to/script_file:从指定的文件中读取脚本并运行;

-i: 直接修改源文件;

地址定界:

#: 指定行;

$: 最后一行;

/regexp/:任何能够被regexp所匹配到的行;sed ‘/^#/d’ /etc/fstab #删除以井号开头的行

\%regexp%:同上,只不过换作%为regexp边界符;

/regexp/| :匹配时忽略字符大小写;

\%regexp%| :匹配时忽略字符大小写;

startline,endline:

#,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行;

#,#

/regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行;

#,+|-n:从#行开始,一直到向下的n行;

first~step:指定起始行,以及步长;

sed的编辑命令

d: 删除模式空间中的行;sed ‘1,2d’ /etc/fstab

=:显示行号;sed ‘/^#/=’ /etc/fstab #显示以#号开头的行的行号

a \text:附加text;sed ‘/^#/a \new line’ /etc/fstab #在以井号开头行的后面添加new line字样

sed ‘1a \new line\nsecond line\ntherid line’ #\n表示换行符

i \text:插入text,支持\n实现多行插入;

c \text:用text替换匹配到的行;sed ‘/5,7/c \new txt’ #五到七行都替换成一个new txt

sed ‘/^#/c \new txt’ /etc/fstab #只有井号开头的行都替换成new txt,不只一个

p: 打印模式空间中的行;sed ‘5,7p’ /etc/fstab #5-7行的内容显示两遍,使用-n才符合我们的期望

s/regexp/replacement/:替换由regexp所匹配到的内容为replacement;

g: 全局替换;

i: 不区分大小写 #sed ‘s/^#//g’ /etc/fstab

w /path/to/somefile:把指定的内容另存至/path/to/somefile路径所指定的文件中;

# sed ‘5,9w /tmp/test1.txt’ /etc/fstab #将fstab中的5-9行写到test1.txt中

r /path/from/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并;

#sed ‘8r /etc/issue’ /etc/fstab #将issue的第8行之后的内容读进来放到fstab之前

练习:

(1) 删除/boot/grub/grub.conf文件中所有行的行首的空白字符;

sed 's/^[[:space:]]\+//' /boot/grub/grub.conf

(2) 删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符;

sed 's/^#[[:space:]]\+//' /etc/fstab

(3) 把/etc/fstab文件的奇数行另存为/tmp/fstab.3;

sed '1~2w /tmp/fstab.3' /etc/fstab

(4) echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名;

取基名:echo "/etc/sysconfig/network-scripts/" | sed 's@^.*/\([^/]\+\)/\?$@\1@'

取路径名:echo "/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'

Sed不仅有一个模式空间,还有一个保持空间,它可以帮助sed暂时存储一些东西以便后续的使用。

高级命令:

h:用模式空间中的内容覆盖保持空间的内容;

H:把模式空间中的内容追加至保持空间中内容的后面;

g:从保持空间中取到其内容,并将其覆盖模式空间中的内容;

G:从保持空间中取到其内容,并将其追加在模式空间中的内容的后面;

x:把保持空间和模式空间中的进行交换;

n:读取匹配到的行的下一行至模式空间;(会覆盖模式空间中的原有内容);

N:读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面;

d:删除模式空间中的内容;

D:删除多行模式空间中的首行;

注意:命令功能可使用!取反;分号可用于分隔脚本;

示例:

sed 'G' /etc/issue: 在文件中的每行后方添加空白行;

sed '$!d' /etc/fstab:保留最后一行;

sed '/^$/d;G' /etc/issue: 保证指定的文件每一行后方有且只有一个空白行;

sed 'n;d' /etc/issue:保留奇数行;

sed -n '1!G;h;$p' /etc/issue :全文倒叙显示

sed '$!N;$!D' /etc/issue:显示最后两行

sed命令:

-e 'script' -e 'script'

'script;script;script' 与上一行模式相同

script

script

script

-f /path/from/script 都是第一行的作用

linux学习

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java 成神之路

编码规范

37890
来自专栏青青天空树

async简单使用

       node的异步io虽然好用,但是控制异步流程确实一个比较麻烦的事情,比如在爬虫中控制并发数量,避免并发过大导致网站宕机或被加入黑名单。因此需要一个...

11010
来自专栏天天

$.ajax()

77450
来自专栏疯狂的小程序

微信小程序for循环里条件判断

今天踩了一下午的坑,但是确实很简单的问题。

48250
来自专栏liulun

CodeFirst写界面——自己写客户端UI库

何谓CBS程序 CBS程序就是Client+Browser+Service的程序 纯CS程序写界面,有各种难处,那么我就在Client端引入Browser,让B...

263100
来自专栏从零开始学 Web 前端

从零开始学 Web 之 Ajax(二)PHP基础语法

浏览器是不识别 PHP 文件的,用浏览器发开 PHP 文件,只会显示 PHP 的源代码,所以 PHP 文件必须在服务器中执行。其实 apache 服务器也识别不...

15120
来自专栏轻扬小栈

Vim 常用快捷键及键盘图

23130
来自专栏xingoo, 一个梦想做发明家的程序员

Windows下elasticsearch插入数据报错!

  按照官方文档操作,但是windows下有些不同,它不认识单引号',因此如果这样操作,就会报错: C:\Users\neusoft>curl localhos...

202100
来自专栏向治洪

android 资源文字ids的作用

ids.xml——为应用的相关资源提供唯一的资源id。id是为了获得xml中的对象而需要的参数,也就是Object = findViewById(R.id.id...

39250
来自专栏小灰灰

报警系统QuickAlarm之报警执行器的设计与实现

根据前面一篇总纲的博文,将整体结构划分为了四大块,本文则主要目标集中在第一块,报警执行器(AlarmExecute)的设计与加载上了 主要的关注点无外乎 定义-...

29950

扫码关注云+社区

领取腾讯云代金券