zoukankan      html  css  js  c++  java
  • bash--使用sed命令

    sed (流文本编辑器)

        用法:sed OPTIONS... [SCRIPT] [INPUTFILE...]
            -r: 使用扩展的正则表达式; 
            -n, --quiet, --silent: 不输出模式空间的内容;
            -i:直接编辑原文件;
            -e: -e '' -e '' -e ''
                'CMD1;CMD2;CMD3'
            # sed -e '1d' -e '2p' /etc/fstab
            # sed '1d;2p' /etc/fstab #同时执行多条命令
            -f /path/to/sed_script:从指定的文件读取处理脚本

    sed 工作流程

    工作流程:把文本中第一行读取到模式空间(内存)--在模式空间内进行编辑(script)--输出编辑后的内容--清空模式空间(再循环到第一步)

    地址定界:

    #(行号): 指定行
    $: 最后一行
    /regexp/:任何能够被regexp匹配到的行 # sed '/dev/d' /etc/fstab #删除匹配到dev的行
    \%regexp%: 任何能够被regexp匹配到的行;换用%为边界符号;# sed '\%/dev/mapper%d' /etc/fstab #删除匹配到/dev/mapper的行。边界匹配可以换成@,#等,但必须是@开头和@结尾
    /regexp/I  # sed '/dev/Id' /etc/fstab
    \%regexp%I:匹配时忽略字符大小写;
          addr1, addr2: 指定范围内的所有行:
    1·,/regexp/    
    #(行号),#(行号)
     /regexp/,/regexp/
    #(行号),+# :假如#=2,则+#等于加后面2行 # sed '2,+2d' /etc/fstab,删除第2行开始,到第4行匹配到的内容
    first~step:指定起始位置,以及步长 1~3 # sed '1~2d' /etc/fstab

    基本正则表达式元字符:

    字符:.  []  [^]
    次数:*, +, ?, {i,j}
    分组:()
    锚定:^, $, <, >
    或者:|
    后向引用:1, 2, ...

    编辑命令:

    注意:命令之前可以使用!表示取反操作;
     =: 显示行号
       # sed -n '\%/dev/mapper%=' /etc/fstab #打印匹配到/dev/mapper的行号
    d: 删除匹配到的行;
    p: 打印模式空间中的内容;
       通常与-n选项一同使用;
       # sed -n '3,5p' /etc/fstab #输出第3到5行,如果不加-n参数,第3到5行会打印2遍
    a 	ext: append, # sed '1a 	est' /etc/fstab
    a 	ext1
    text2
    text3: 附加多行文本
    i 	ext:insert, 
       i 	ext1
    text2: 插入多行文本
    c 	ext: change,把匹配到的行替换为给定的文本
       # sed '3c mmmm' /etc/fstab #把文件第3行替换成mmmm,一整行替换
    s///: 替换命令
        g: 全局替换
        i: 不区分大小写
        # sed 's/dev/etc/g' /etc/fstab #将文件中dev替换为etc

    实例:

    1 删除/boot/grub/grub.conf文件中所以空白开头的行行首的空白
    # sed 's/^[[:space:]]+//g' /boot/grub/grub.conf
    2 删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符
    # sed 's/^#[[:space:]]+//' /etc/fstab
    3 echo一个文件路径给sed命令,取出其基名;取出其目录名
    # echo "/etc/sysconfig/" | sed 's@[^/]{1,}/?$@@g'
    4 替换/etc/inittab文件“id:数字:initdefault:”一行中的那个数字为6
    # sed 's@id:[0-9]:initdefault:@id:6:initdefault@' /etc/inittab

    高级编辑命令:

     h: 用模式空间中的内容覆盖保持空间中的内容;
     H:把模式空间中的内容追求至保持空间;
     g: get, 从保持空间取回数据至模式空间,覆盖模式空间中原有的内容;
     G:GET, 从保持空间取回数据至模式空间,追加于模式空间中现有的内容后面;
     x: 把模式空间和保持空间中的内容进行交换;
     n: 读取匹配到的行下一行至模式空间;
     N: 追加读匹配到的行下一行至模式空间;
     d: 删除模式空间中的内容;
     D:删除多行模式空间中首行;
    sed '1!G;h;$!d' FILE
    #解释:取文件第一行,第一行不执行G命令(其他行要执行G命令);执行h命令;最后一行不执行d命令(不是最后一行都要执行d命令),循环每一行

    显示文件的偶数行:

    [root@iscsi ~]# cat aa
    aa
    bb
    cc
    dd
    mm
    命令:sed -n 'n;p' FILE;   或者  sed -n '2~2p' FILE
    [root@iscsi ~]# sed -n 'n;p' aa
    bb
    dd
    [root@iscsi ~]# sed -n '2~2p' aa
    bb
    dd

    显示文件的奇数行:

    命令:sed -n 'p;n' FILE;     sed -n '1~2p' FILE
    [root@iscsi ~]# sed -n 'p;n' aa
    aa
    cc
    mm
    [root@iscsi ~]# sed -n '1~2p' aa
    aa
    cc
    mm

    运用 sed 命令高效地删除文件的特定行

    注意:-i 表示直接进行文件操作,而不在终端上显示结果。
    1 删除某一行 sed 'Nd' file
    # sed '1d' sed_test.ext
    # sed '$d' sed_test.txt 删除最后一行
    2. 删除某些行
    # sed '5,7d' sed_test.txt #删除5,6,7行
    # sed '1d;5d;9d;$d' sed_test.txt #删除不连续的行
    # sed '3,6!d' sed_test.txt #删除第 3到 6 行以外的其他行
    3. 删除空白行
    # sed '/^$/d' sed_test.txt #这里两个斜杠 / / 内的表达式起到了文本匹配的作用
    4. 删除包含特定字符的行
    # sed '/System/d' sed_test.txt 
    # sed '/System|Linux/d' sed_test.txt  #符号 | 代表逻辑或,文本中有 System 或 Linux 的行都要进行删除。
    5. 删除特定字符开头的行
    # sed '/^R/d' sed_test.txt  #删除已R开头的行
    # sed '/^[RF]/d' sed_test.txt  #删除以 R 或者 F 开头的行
    6. 删除特定字符结尾的行
    # sed '/m$/d' #删除以m结尾的行
    # sed '/[xm]$/d' #删除以X或m结尾的行
    7. 删除以大写字母开头的行
    # sed '/^[A-Z]/d'
    8. 删除包含字母字符的行
    # sed '/[A-Za-z]/d'
    9. 删除包含数字的行
    # sed '/[0-9]/d'
    # sed '1,6{/Linux/d;}' #指定删除在 1 到 6 行内有 Linux 这个词的内容
    # sed '/System/{N;d;}' #删除包含 System 以及其下一行的内容

    练习:说明以下sed命令的意义:

    (1) sed '$!N;$!D' /etc/issue
    (2) sed '$!d' /etc/issue #最后一行不执行删除命令,即删除最后一行之前的行
    (3) sed 'G' /etc/issue #每行后面加空白行
    (4) sed '/^$/d;G' /etc/issue
    (5) sed 'n;d' /etc/issue #删除偶数行
    (6) sed -n '1!G;h;$p' /etc/issue
  • 相关阅读:
    MessageDigest简介
    深入入门正则表达式(java)
    JAVA 正则 Pattern 和 Matcher
    理解Servlet过滤器 (javax.servlet.Filter)
    Java 之 I/O 系列 01 ——基础
    finally块中的代码一定会执行吗?
    wait(), notify(),sleep详解
    Java 多线程——基础知识
    集合迭代时对集合进行修改抛ConcurrentModificationException 原因 以及解决方案
    深入理解ServletRequest与ServletResponse
  • 原文地址:https://www.cnblogs.com/yhq1314/p/13691734.html
Copyright © 2011-2022 走看看