zoukankan      html  css  js  c++  java
  • Linux sed命令使用方法

     sed(Stream Editor)是Linux中文本处理使用非常广泛的工具,可以对文件内容进行替换、删除、新增、选取特定行等功能。下面通过sed常用实例介绍sed命令的使用方法。

    sed基本语法

     sed命令使用格式:sed [-nefir] ‘sed command’filename

     选项说明:

    -n:只打印模式匹配的行
    -e:多重编辑操作时添加。
    -r:支持扩展正则表达式
    -i:直接修改原文件内容,原文件内容会发生变化。默认是不会对原文件内容修改。

      选项实例说明:

    (1)-n选项,只打印模式匹配的行,假设需求为打印第一行文件内容,包含和不包含-n选项的命令如下:

    sed -n '1p' /etc/passwd #仅打印出第一行
    sed '1p' /etc/passwd #不仅打印第一行内容,还显示整个/etc/passwd内容

      说明:对比下输出结果就可以直观判断sed命令有无-n选项的区别了。

    (2)-e选项。在多重编辑操作时添加,假设需求为同时打印包含root字符串或者oracle字符串的行。

    sed -n -e '/root/p' -e '/oracle/p' /etc/passwd

    (3)-r选项,支持扩展正则表达式。首先需要了解通配符与基础正则表达式、扩展正则表达式的关系与区别。假设需求同为打印包含root字符串或者oracle字符串的行。则带-r选项写法为:

    sed -n -r '/(root|oracle)/p' /etc/passwd #打印包含root或oracle字符串的行

      如果不带-r选项的写法,则为如下:

    sed -n '/(root|oracle)/p' /etc/passwd #打印包含root或oracle字符串的行

      发现区别吗?-r选项可以支持扩展正则表达式,如果sed命令涉及使用扩展正则表达式,使用-r选项,可以简化命令编写,可以使sed命令更直观、简单。下面说说sed command命令的格式。

      sed command命令格式可以理解为包含两部分内容:[定位文本内容方式][sed编辑命令]。简单的说,就是先定位要处理的行或者行区间行再执行相应处理,默认是处理文本中的每一行。定位文本内容通常为直接使用行号、正则表达式或者它们二者的混合使用。常见的定位行或行区间的方式如下:

    (1)line 表示用数字指定行号,如打印文件第1行内容

    sed -n '1p' /etc/passwd #打印第1行

    (2)line1,line2 表示行号范围从line1到line2,如打印第2行到第5行的文件内容

    sed -n '2,5p' /etc/passwd

    (3)/pattern/ 查询包含指定模式的行。如打印行首为root字符串的行

    sed -n '/^root/p' /etc/passwd

    (4)/pattern/,line 获取匹配模式的行到指定行直接的文本内容。如打印行首匹配root字符串的行到第5行的文本内容

    sed -n '/^root/,5p' /etc/passwd

    (5)line,/pattern/  获取指定行号到首次匹配模式行之间的内容。如打印第3行到首次匹配root字符串之间的文本内容

    sed -n '3,/root/p' /etc/passwd

    (6)line1,line2 ! 获取不在指定行line1和line2区间的内容。如获取除了第3-5行之间的内容

    sed -n '3,5 !p' /etc/passwd

      在获取到匹配行之后,就可以执行sed编辑命令进行处理了。基本的sed编辑命令如下所示:

    a 在匹配行下面添加文本
    i 在匹配行上面插入文本。
    c 用新文本替换选定的文本内容。
    d 删除,删除选择的行。
    s 替换指定字符
    p 打印模板块的行。  
    = 打印当前行号码。

      说明:上述仅列举最常用的sed编辑命令,通常能够满足绝大部分需求,如果想进一步了解,可以查阅sed命令相关手册。

    sed命令使用基本实例

    1、根据匹配模式或者指定行号查找文件指定内容

    (1)通过行号打印指定内容

    sed -n '1p' /etc/passwd #打印第1行
    sed -n '3p' /etc/passwd #打印第3行
    sed -n '$p' /etc/passwd #打印最后1行

    (2)通过模式匹配打印指定内容

    sed -n '/^root/p' /etc/passwd #打印行首为root字符串的行。输出root:x:0:0:root:/root:/bin/bash

      如果需要匹配多个模式呢,可以使用如下方式:

    sed -n '/^root/{/bash/p}' /etc/passwd #同时匹配行首为root且包含bash字符串的行

    (3)通过指定行范围打印内容

    sed -n '1,3p' /etc/passwd #打印第1-3行内容
    sed -n '1,$p' /etc/passwd #打印全文内容

    (4)通过2个模式匹配指定行范围打印内容

    sed -n '/root/,/oracle/p' /etc/passwd # 打印匹配root字符串到oracle字符串的行

      说明:如果第1个模式(/root/)没有匹配到,则输出为空。如果第二个模式(/oracle/)没有匹配到,则会打印到最后一行。

    (5)组合行号和模式匹配指定行范围打印内容

    sed -n '3,/root/p' /etc/passwd  #打印第1行到最先匹配包含root字符串的行

    2、根据指定匹配模式获取行号

    (1)获取行首为oracle字符串的行号

    sed -n '/^oracle:/=' /etc/passwd #获取行首oracle字符串的行号

    3、根据指定行号或匹配模式对文件整行内容增加、删除、修改

    (1)在指定行号前插入文件内容

    sed '3i new line' /etc/passwd #在第3行前插入内容为new line的行

    (2)在指定行号后插入文件内容

    sed '3a new line' /etc/passwd #在第3行后插入内容为new line的行

    (3)在指定行或者行范围内替换文本

    sed '3c new line' /etc/passwd #将第3行替换为内容为new line的行
    sed '1,3c new line' /etc/passwd #将第1-3行替换为内容为new line的行

    (4)删除指定行或者行范围内的文本内容

    sed '1d' /etc/passwd #删除第1行
    sed '1,3d' /etc/passwd #删除第1-3行
    sed '$d' /etc/passwd #删除最后1行
    sed '/root/d' /etc/passwd #删除包含root的行
    sed '3,/root/d' /etc/passwd  #删除第1行到最先匹配包含root字符串的行
    sed '/root/,/oracle/d' /etc/passwd #删除匹配root字符串到oracle字符串的行

    4、文本内容字符串替换

    (1)将全文IP1 192.168.0.1替换为IP2 127.0.0.1。

    sed 's/192.168.0.1/127.0.0.1/g' filename

    (2)指定行范围替换IP1 192.168.0.1替换为IP2 127.0.0.1。

    sed '1,5s/192.168.0.1/127.0.0.1/g' file

    (3)在文件中每行最后添加一个abc字符串

    sed 's/$/abc/g' filename

    (4)引用匹配模式内容替换。通过&号实现。在匹配内容前加"hello"

    echo "Java:Python:Ruby" | sed 's/Java/hello &/g' #输出hello Java:Python:Ruby

    (5)通过模式匹配指定行进行内容修改。将匹配到root字符串的行中的IP进行替换。

    sed '/root/s/192.168.0.1/127.0.0.1/g' 

    5、获取shell变量

    (1)获取shell变量内容替换指定字符串,使用双引号包含sed命令。举例如下

    var="Ruby"
    echo "Hello Java" |sed "s/Java/${var}/g"  #输出Hello Ruby
  • 相关阅读:
    Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法
    ubuntu 关闭显示器的命令
    ubuntu android studio kvm
    ubuntu 14.04版本更改文件夹背景色为草绿色
    ubuntu 创建桌面快捷方式
    Ubuntu 如何更改用户密码
    ubuntu 14.04 返回到经典桌面方法
    ubuntu 信使(iptux) 创建桌面快捷方式
    Eclipse failed to get the required ADT version number from the sdk
    Eclipse '<>' operator is not allowed for source level below 1.7
  • 原文地址:https://www.cnblogs.com/linyfeng/p/8993525.html
Copyright © 2011-2022 走看看