sed(意为流编辑器,英语“stream editor”的缩写)是Unix/linux常见的命令行程序。sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出,即文本替换。sed通常用来匹配一个或多个正则表达式的文本进行处理。

输入sed --help查看帮助信息:

  1. amosli@amosli-pc:~/learn/sed$ sed --help
  2. Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
  3.  
  4. -n, --quiet, --silent
  5. suppress automatic printing of pattern space
  6. -e script, --expression=script
  7. add the script to the commands to be executed
  8. -f script-file, --file=script-file
  9. add the contents of script-file to the commands to be executed
  10. --follow-symlinks
  11. follow symlinks when processing in place
  12. -i[SUFFIX], --in-place[=SUFFIX]
  13. edit files in place (makes backup if extension supplied)
  14. -l N, --line-length=N
  15. specify the desired line-wrap length for the `l' command
  16. --posix
  17. disable all GNU extensions.
  18. -r, --regexp-extended
  19. use extended regular expressions in the script.
  20. -s, --separate
  21. consider files as separate rather than as a single continuous
  22. long stream.
  23. -u, --unbuffered
  24. load minimal amounts of data from the input files and flush
  25. the output buffers more often
  26. --help display this help and exit
  27. --version output version information and exit
  28.  
  29. If no -e, --expression, -f, or --file option is given, then the first
  30. non-option argument is taken as the sed script to interpret. All
  31. remaining arguments are names of input files; if no input files are
  32. specified, then the standard input is read.

语法:

  1. sed [OPTION]... {script-only-if-no-other-script} [input-file]...

参数-实例:

测试文件:test.txt

  1. amosli@amosli-pc:~/learn/sed$ cat test.txt
  2. hi,this is sed command test file
  3. linux world is so amazing
  4.  
  5. you will like it!

1.简单的文本替换

常用格式:

  1. sed 's/pattern/replace_string' file
  2. #或者
  3. cat file | sed 's/pattern/replace_string' file

其中pattern为模式,replace_string为替换词.即,将符合pattern的字符串替换为replace_string .

例:将will变为大写WILL

  1. amosli@amosli-pc:~/learn/sed$ sed "s/will/WILL/" test.txt
  2. hi,this is sed command test file
  3. linux world is so amazing
  4.  
  5. you WILL like it!

使用标准输入:

  1. amosli@amosli-pc:~/learn/sed$ echo "this is test" | sed "s/test/TEST/"
  2. this is TEST

2.-i参数,将替换结果应用于原文件

默认情况下sed不会修改原文件,因为式作原理为:sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

  1. amosli@amosli-pc:~/learn/sed$ sed -i 's/like/LOVE/' test.txt
  2. amosli@amosli-pc:~/learn/sed$ cat test.txt
  3. hi,this is sed command test file
  4. linux world is so amazing
  5.  
  6. you will LOVE it!

英文提示信息:

  1. -i[SUFFIX], --in-place[=SUFFIX]
  2. edit files in place (makes backup if extension supplied)

3、关于后缀/g

/g默认表示替换所有符合条件的文本。

  1. amosli@amosli-pc:~/learn/sed$ echo "test1 test2 test3 test4 " | sed "s/test/TEST/g"
  2. TEST1 TEST2 TEST3 TEST4

/Ng表示从第N个符合条件的开始替换.

  1. amosli@amosli-pc:~/learn/sed$ echo "test1 test2 test3 test4 " | sed "s/test/TEST/3g"
  2. test1 test2 TEST3 TEST4

4、关于字符'/'

字符‘/’在sed命令中扮演着定界符的作用,'|'和':'的作用和'/'一样,可以做为定界符使用

如:

  1. amosli@amosli-pc:~/learn/sed$ echo "test1 test2 test3 test4 " | sed "s:test:TEST:g"
  2. TEST1 TEST2 TEST3 TEST4
  3. amosli@amosli-pc:~/learn/sed$ echo "test1 test2 test3 test4 " | sed "s|test|TEST|g"
  4. TEST1 TEST2 TEST3 TEST4

当定界符出现在样式内部中,可以使用前缀\对它进行转义,如:

amosli@amosli-pc:~/learn/sed$ echo "te/st1 te/st2 te/st3 te/st4 " | sed "s/test/TEST/g"
te/st1 te/st2 te/st3 te/st4

这样替换就失效了,使用前缀\进行转义

  1. amosli@amosli-pc:~/learn/sed$ echo "te/st1 te/st2 te/st3 te/st4 " | sed "s/te\/st/TEST/g"
  2. TEST1 TEST2 TEST3 TEST4

5.移除空白行

  1. amosli@amosli-pc:~/learn/sed$ sed '/^$/d' test.txt
  2. hi,this is sed command test file
  3. linux world is so amazing
  4. you will LOVE it!

/pattern/d 会移除匹配样式的行

^$行尾标记紧临表示空白行。

6.&代表已经匹配的字符串

  1. amosli@amosli-pc:~/learn/sed$ echo this is a test | sed 's/\w\+/[&]/g'
  2. [this] [is] [a] [test]

\w\+ 正则表达式表示匹配每一个单词,&对应于之前所匹配到的单词,使用[&]进行替换。

7.子串匹配字符口中\1

  1. amosli@amosli-pc:~/learn/sed$ echo this is digit in a number | sed 's/digit \([0-9]\)/\1/'
  2. this is in a number

这条命令将digit 7 替换为7,\(pattern\) 用于匹配子串,模式被包含在使用生命线转义过的()中。对于匹配到的第一个子串,其对应的标记是\1,匹配到的第二个子串为\2,以次类推。

8.组合多个表达式

  1. amosli@amosli-pc:~/learn/sed$ cat test.txt
  2. hi,this is sed command test file
  3. linux world is so amazing
  4.  
  5. you will LOVE it!
  6. amosli@amosli-pc:~/learn/sed$ cat test.txt | sed 's/linux/LINUX/' | sed 's/sed/SED/'
  7. hi,this is SED command test file
  8. LINUX world is so amazing
  9.  
  10. you will LOVE it!

也可以使用:

  1. amosli@amosli-pc:~/learn/sed$ cat test.txt | sed "s/linux/LINUX/; s/sed/SED/"
  2. hi,this is SED command test file
  3. LINUX world is so amazing
  4.  
  5. you will LOVE it!

格式为:

  1. sed 'expression' | sed 'expression'
  2. #or
  3. sed 'expression;expression'

9.引用

定义变量:

  1. amosli@amosli-pc:~/learn/sed$ txt=hello

引用变量:

  1. amosli@amosli-pc:~/learn/sed$ echo "hello world" | sed "s/$txt/HELLO/g"
  2. HELLO world

10.可选参数:

 命令  功能
 a\

在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行

 c\  用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
 i\  在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
 d  删除行
 h  把模式空间里的内容复制到暂存缓冲区
 H  把模式空间里的内容追加到暂存缓冲区
 g  把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
 G  把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
 l  列出非打印字符
 p  打印行
 n  读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
 q  结束或退出sed
 r  从文件中读取输入行
 !  对所选行以外的所有行应用命令
 s  用一个字符串替换另一个
 g  在行内进行全局替换
   
 w  将所选的行写入文件
 x  交换暂存缓冲区与模式空间的内容
 y  将字符替换为另一字符(不能对正则表达式使用y命令)

其他选项:

  1. 选项 功能
  2. -e 进行多项编辑,即对输入行应用多条sed命令时使用
  3. -n 取消默认的输出
  4. -f 指定sed脚本的文件名

元字符总结:

 元字符  功能  示例
 ^  行首定位符  /^my/  匹配所有以my开头的行
 $  行尾定位符  /my$/  匹配所有以my结尾的行
 .  匹配除换行符以外的单个字符  /m..y/  匹配包含字母m,后跟两个任意字符,再跟字母y的行
 *  匹配零个或多个前导字符  /my*/  匹配包含字母m,后跟零个或多个y字母的行
 []  匹配指定字符组内的任一字符  /[Mm]y/  匹配包含My或my的行
 [^]  匹配不在指定字符组内的任一字符  /[^Mm]y/  匹配包含y,但y之前的那个字符不是M或m的行
 \(..\)  保存已匹配的字符  1,20s/\(you\)self/\1r/  标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
 &  保存查找串以便在替换串中引用  s/my/**&**/  符号&代表查找串。my将被替换为**my**
 \<  词首定位符  /\<my/  匹配包含以my开头的单词的行
 \>  词尾定位符  /my\>/  匹配包含以my结尾的单词的行
 x\{m\}  连续m个x  /9\{5\}/ 匹配包含连续5个9的行
 x\{m,\}  至少m个x  /9\{5,\}/  匹配包含至少连续5个9的行
 x\{m,n\}  至少m个,但不超过n个x  /9\{5,7\}/  匹配包含连续5到7个9的行

linux shell 脚本攻略学习19--sed命令详解的更多相关文章

  1. linux shell 脚本攻略学习12--文件权限详解,chmod命令详解,chown命令详解,chattr命令详解

    文件权限详解 一.chmod命令详解 文件权限和所有权是Unix/Linux文件系统最显著的特征之一.linux中的每一个文件都与多种权限类型相关联,在这些权限中主要分类为3种: 用户(User)是文 ...

  2. linux shell 脚本攻略学习6-xargs详解

    xargs是一条Unix和类Unix操作系统的常用命令.它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题. 例如,下面的命令: rm `find /path -type f` ...

  3. linux shell 脚本攻略学习20--awk命令入门详解

    awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...

  4. linux shell 脚本攻略学习16--wc命令详解,tree命令详解

    在文本处理的工作中,统计文件的行数,单词数和字符数非常有用.而对于开发人员本身来说,统计LOC(line of code ,代码行数)是一件重要的工作.linux中有什么命令可以帮助我们做统计呢?没错 ...

  5. linux shell 脚本攻略学习14--head命令详解,tail命令详解

    当要查看上千行的大文件时,我们可不会用cat命令把整个文件内容给打印出来,相反,我们可能只需要看文件的一小部分地内容(例如文件的前十行和后十行),我们也有可能需要打印出来前n行或后n行,也有可能打印除 ...

  6. linux shell 脚本攻略学习13--file命令详解,diff命令详解

    一.file命令详解 find命令可以通过查看文件内容来找出特定类型的文件,在UNIX/ Linux系统中,文件类型并不是由文件扩展名来决定的(windows中却正是这么做的),file命令的目的是从 ...

  7. linux shell 脚本攻略学习11--mkdir和touch命令详解

    一.创建目录(mkdir命令详解) amosli@amosli-pc:~/learn$ mkdir dir amosli@amosli-pc:~/learn/dir$ mkdir folder amo ...

  8. linux shell 脚本攻略学习9--rename命令详解

    rename命令详解: 对文件重命名是常用的操作之一,一般对单个文件的重命名用mv命令,如: amosli@amosli-pc:~/learn/example$ ls abc.txt amosli@a ...

  9. linux shell 脚本攻略学习8---md5校验,sort排序,uniq命令详解

    一.校验与核实 目前最为出名的校验技术是md5sum和sha1sum,它们对文件内容使用相应的算法来生成校验和. 举例: amosli@amosli-pc:~/learn$ md5sum text.t ...

  10. linux shell 脚本攻略学习7---tr命令详解

    tr命令详解 什么是tr命令?tr,translate的简写,translate的翻译: [trænsˈleit] vi. 翻译, 能被译出 vt. 翻译, 解释, 转化, 转变为, 调动 在这里用到 ...

随机推荐

  1. supersocket+controller+action

    public class MasterServer : SuperSocket.SocketBase.AppServer<MasterSession> { } public class M ...

  2. Unity Shader——Writing Surface Shaders(0)

    从今天起,开始翻译Unity关于shader的官方文档.翻译水平比较一般,目的主要是通过翻译来提升对shader的见解,也让其他人更容易的了解shader.以下开始正文内容: 编写Surface Sh ...

  3. 安全快速修改Mysql数据库名的5种方法

    1. RENAME DATABASE db_name TO new_db_name这个..这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了.据说有可能丢失数据.还是不要用的好.详 ...

  4. java比较两个字符串是否相等

    从c 到c++ 到 c# 到 JavaScript  判断两个字符串是否相等,用==号都可以.奇葩的java怎么可以只能用equals()这个函数.只是因为String是引用类型吗??!!哭笑不得.. ...

  5. python---str

    Python转义字符 \ (在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 换行 \v 纵向制 ...

  6. SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历?

    二者的定义:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有 ...

  7. 7. Reverse Words in a String

    题目: Given an input string, reverse the string word by word. For example,Given s = "the sky is b ...

  8. Zepto源码

    // Zepto.js // (c) 2010-2016 Thomas Fuchs // Zepto.js may be freely distributed under the MIT licens ...

  9. 新书发布《大数据时代的IT架构设计》

    <大数据时代的IT架构设计>以大数据时代为背景,邀请著名企业中的一线架构师,结合工作中的实际案例展开与架构相关的讨论.<大数据时代的IT架构设计>作者来自互联网.教育.传统行业 ...

  10. c++ primer 5th 练习3.43

    #include <iostream> using namespace std; int main() { ][]={,,,,,,,,,,,}; /* for(int (&i)[4 ...