美文网首页
linux || sed(2)

linux || sed(2)

作者: 溪溪溪溪溪川 | 来源:发表于2019-04-13 13:58 被阅读0次

    调用sed有三种方式

    • 在命令行键入命令;
    • 将sed命令插入脚本文件,然后调用sed;
    • 将sed命令插入脚本文件,并使sed脚本可执行。

    1.使用sed命令行格式为:
    sed [options] sed命令 输入文件

    记住在命令行使用sed命令时,实际命令要加单引号。sed也允许加双引号。

    2.使用sed脚本文件,格式为:
    sed [options] -f sed脚本文件 输入文件

    3.要使用第一行具有sed命令解释器的sed脚本文件,其格式为:
    sed脚本文件 [options] 输入文件

    不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件, sed从标准输入中
    接受输入,一般是键盘或重定向结果。

    sed options如下:
    • n 不打印;sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。
    • e∶进行多项编辑,即对输入行应用多条sed命令时使用. 直接在指令列模式上进行 sed 的动作编辑
    • c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条sed命令,此选项无用,但指定它也没有关系。
    • f 如果正在调用sed脚本文件,使用此选项。
    • i∶直接修改读取的文件内容,而不是由屏幕输出
    1.使用sed在文件中查询文本的方式

    sed浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
    1)使用行号,可以是一个简单数字,或是一个行号范围。
    2 ) 使用正则表达式

    使用sed定位文本的一些方式
    命令 描述
    x x为一行号,如1
    x , y 表示行号范围从x到y,如2,5表示从第2行到第5行
    /pattern/ 查询包含模式的行。例如/disk/或/[a-z]/
    /pattern/pattern/ 查询包含两个模式的行。例如/disk/disks/
    /pattern/,x 在给定行号上查询包含模式的行。如/ ibbon/ , 3
    x , /pattern/ 通过行号和模式查询匹配行。3,/vdu/
    x , y ! 查询不包含指定行号x和y的行。1 , 2 !
    2.基本sed编辑命令

    sed编辑命令

    命令 描述
    p 打印匹配行
    = 显示文件行号
    a \ 在定位行号后附加新文本信息
    i \ 在定位行号后插入新文本信息
    d 删除定位行
    c \ 用新文本替换定位文本
    s 使用替换模式替换相应模式
    r 从另一个文件中读文本
    w 写文本到一个文件
    q 第一个模式匹配完成后推出或立即推出
    l 显示与八进制ASCII代码等价的控制字符
    { } 在定位行执行的命令组
    n 从另一个文件中读文本下一行,并附加在下一行
    g 将模式2粘贴到/pattern n/
    y 传送字符
    n 延续到下一输入行;允许跨行的模式匹配语句
    3.sed和正则表达式

    sed正则

    命令 描述
    ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
    $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
    . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
    * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
    [] 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。
    [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
    (..) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。
    & 保存搜索字符用来替换其他字符,如s/love/&/,love这成love。
    < 匹配单词的开始,如:/<love/匹配包含以love开头的单词的行。
    > 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
    x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行。
    x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
    x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。
    4.基本sed使用举例(都是要test.txt文件)

    1)使用p(rint)显示行
    ptint命令格式为[ address [,address ] P。显示文本行必须提供sed命令行号

    pengzw@super-server:~$ cat test.txt 
    Hello,world!
    Write a word!
    I love dog!
    Good good study, day day up!
    I have $1.
    pengzw@super-server:~$ sed -n '2p' test.txt
    Write a word!
    

    2)打印范围:可以指定行的范围,现打印1到3行,用逗号分隔行号。

    pengzw@super-server:~$ sed -n '1,2p' test.txt
    Hello,world!
    Write a word!
    

    3)打印模式:匹配单词day,并打印此行,使用模式/pattren/

    pengzw@super-server:~$ sed -n '/day/'p test.txt
    Good good study, day day up!
    

    4)使用模式和行号进行查询:4 , /the/,但是有一个问题,如果行号指定不对,会出现指定行和匹配day的行。

    pengzw@super-server:~$ sed -n '4,/day/'p test.txt
    Good good study, day day up!
    pengzw@super-server:~$ sed -n '3,/day/'p test.txt
    I love dog!
    Good good study, day day up!
    

    5)匹配元字符
    匹配元字符$前,必须使用反斜线\屏蔽其特殊含义。模式为/$/ p。

    pengzw@super-server:~$ sed -n '/\$/'p test.txt
    I have $1.
    

    6)显示整个文件:1,$p,$意为最后一行。

    pengzw@super-server:~$ sed -n '1,$p' test.txt
    Hello,world!
    Write a word!
    I love dog!
    Good good study, day day up!
    I have $1.
    

    7)任意字符:

    pengzw@super-server:~$ sed -n '/.*u/'p test.txt
    Good good study, day day up!
    

    8)首行:比较两种写法,一般都是第二种

    pengzw@super-server:~$ sed -n '1'p test.txt
    Hello,world!
    pengzw@super-server:~$ sed -n '1p' test.txt
    Hello,world!
    

    9)末行

    pengzw@super-server:~$ sed -n '$p' test.txt
    I have $1.
    

    10)打印行号
    要打印行号,使用等号=。打印模式匹配的行号,使用格式/pattern/ =。
    整个文件都打印出来,并且匹配行打印了行号。

    pengzw@super-server:~$ sed -e '/.u/=' test.txt
    Hello,world!
    Write a word!
    I love dog!
    4
    Good good study, day day up!
    I have $1.
    

    如果只关心实际行号,使用-n选项。

    pengzw@super-server:~$ sed -n '/.u/=' test.txt
    4
    

    如果只打印行号及匹配行,必须使用两个sed命令,并使用e选项。第一个命令打印模式
    匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=。

    pengzw@super-server:~$ sed -n -e '/u/p' -e '/u/='  test.txt
    Good good study, day day up!
    4
    

    参考:

    linux与unix shell编程指南.pdf
    https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html

    相关文章

      网友评论

          本文标题:linux || sed(2)

          本文链接:https://www.haomeiwen.com/subject/dxxbiqtx.html