精华内容
下载资源
问答
  • .sed简介sed:是个编辑器,是个强大的文件处理工具。sed作用:用来替换、删除,更新文件中的内容。sed能自动处理个或多个文件。...sed处理完一行就将其从临时缓冲区删除,然后将下一行读...

    一.sed简介sed:是一个编辑器,是一个强大的文件处理工具。

    sed作用:用来替换、删除,更新文件中的内容。sed能自动处理一个或多个文件。

    sed原理:sed以文本的行为单位进行处理,一次处理一行内容。首先sed把当前处理的行存储在临时缓冲区中(称为模式空间pattern space),接着处理缓冲区中的行,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示,这样不断的重复,直到文件末尾。处理完文件的最后一行后,sed便结束运行。

    因为sed是对文件中每行在临时缓冲区中的副本进行编辑,所以原文件内容并没有改变,除非重定向输出。

    二 sed命令

    命令           功能

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

    c               用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行

    i\               在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行

    d                删除行

    h              把模式空间里的内容复制到暂存缓冲区

    H              把模式空间里的内容追加到暂存缓冲区

    g                 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容

    G                把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面

    l                列出非打印字符

    p                打印行

    n                读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理

    q                结束或退出sed

    r                从文件中读取输入行

    !                对所选行以外的所有行应用命令

    s                用一个字符串替换另一个

    g                在行内进行全局替换

    w                 将所选的行写入文件

    x                交换暂存缓冲区与模式空间的内容

    y                将字符替换为另一字符(不能对正则表达式使用y命令)

    三 sed 选项

    -e进行多项编辑,即对输入行应用多条sed命令时使用

    -n取消 默认的输出

    -f指定sed脚本的文件名

    -i         决定不是是将sed的操作作用在源文件上

    -r使用 多个sed命令

    四 地址定位

    x 指定x行号

    x,y 指定x到y行号

    /key/ 查询包含关键字的行

    /key1/,/key2/  匹配包含两个关键字之间的行

    /key/,x  从匹配关键字开始到文件第x行

    x, /key/ 从第x行开始到与关键字的匹配行之间的行

    x,y! 不包含x到y行

    五举例说明1.sed -n '2,5p' 1.txt 打印第二行到第五行,n和p结合使用

    2.sed '2,5d' 1.txt 删除第二行到第五行

    3.sed '1ihello world' 1.txt 在第一行前面插入hello world

    4.sed '1ihello\nworld' 1.txt 在第一行前面插入hello world,换行之后插入world

    5.sed '1ihello\ 在第一行前面插入hello world,换行之后插入world

    world\           在换行之后插入999

    999\' 1.txt

    6.sed '5ahello world' 1.txt 在第5行的下面插入hello world

    7.sed 'ahello world' 1.txt 在每一行的下面插入hello world

    8.sed 'ihello world' 1.txt 每一行的前面插入hello world

    9.sed '$ihello world' 1.txt 每最后一行的前面插入hello world

    10.sed '$ahello world' 1.txt 每最后一行的下面插入hello world

    11.sed '3chello world' 1.txt 把第三行替换成hello world

    12.sed '10r 2.txt' 1.txt 把文件2.txt的内容输入到1.txt的第10行下面

    13.sed -n '1!p' 1.txt 打印第一行之外的所有行

    14.sed '1,5w 2.txt' 1.txt 将1.txt中的第一行到第五行保存到2.txt中

    15.sed '1,5w./home/2.txt' 1.txt 将1.txt中的第一行到第五行令外保存到2.txt中(2.txt

    可以没有,系统会创建)

    16.sed -n 's/root/ROOT/p' 1.txt 替换一行内第一个满足条件的

    17.sed -n 's/root/ROOT/gp' 1.txt替换一行内所有满足条件的

    18.sed -n '5,/^stu/p' 1.txt 从第五行开始匹配以stu开头的行

    19.sed -rn '^lp|^mail/p' 1.txt匹配以lp开头或mail开头的行

    20.sed ‘y/uu/Y#/’ 3.txt 将所有的u替换成Y

    21.sed -n 's/^root/#&/p' 1.txt 注释掉root开头的行

    22.sed -n '/nologin$/=' 1.txt 打印以nologin结尾的行号

    23.sed -i 's/ui/98/;s/123/poi/' 3.txt 修改文件内容

    展开全文
  • 写法: #!/bin/bash while read line do echo $line #这里可根据实际用途变化 done 写法二: #!/bin/bash cat urfile | while read line do echo $line done ... 1 #!... 2 #文件一行
    写法一:
    
    #!/bin/bash
    while read line
    do
          echo $line     #这里可根据实际用途变化
    done < urfile
    



    写法二:
    #!/bin/bash
    cat urfile | while read line
    do
        echo $line
    done


    我的写法:
     
     1 #!/bin/sh
      2 #一次读文件一行
      3 
      4 i=0
      5 while read line
      6 do      
      7         echo $line
      8         let i=i+1
      9 done < a.txt
     10 echo "$i"

    ================================

    sed操作文件某一行的方法:

    sed学习笔记:http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/sed.htm#id2810348

    sed -n '6p' filename     打印文件的第6行

    sed -n '6,10p' filename        打印文件的第6到10行

    sed '/user/d' filename 删除包含“user”的行

    sed '2d' filename 删除第2行

    sed '$d' filename 删除最后一行

    展开全文
  • sed交换任意两

    千次阅读 2016-04-27 17:25:47
    A、B分别是需要交换的,C是B-1 思路: 对于交换相邻的 sed -n 'A{h;n;x;H;x};p' 对于交换不相邻的 sed -n 'A{h;n;:a;N;C!ba;x;H;n;x;H;x};p' 对比发现: :a;N;C!ba;x;H;n; 这个部分是多出来的,因

    命令:

    sed -n 'A{h;n;B!{:a;N;C!ba;x;H;n};x;H;x};p' 文件名


    解释:

    A、B分别是需要交换的行,C是B-1

    其中,A、B、C可以是行号,也可以通过匹配模式,如果是匹配模式,C就需要自己替换为B行的上一行,类似:

    sed -n '/xxx/{h;n;/zzz/!{:a;N;/yyy/!ba;x;H;n};x;H;x};p' 文件名

    将包含xxx与zzz的行交换(zzz在xxx行之后),yyy是zzz行前面的那一行。

    思路:
    对于交换相邻的行
    sed -n 'A{h;n;x;H;x};p'
    对于交换不相邻的行
    sed -n 'A{h;n;:a;N;C!ba;x;H;n;x;H;x};p'
    对比发现:
    :a;N;C!ba;x;H;n; 这个部分是多出来的,因此用 B!{..}把这个部分包围起来。
    解释:
    A{...} 遇到A行开始做序列命令
    h 把A行放到hold space
    n 读取一行并替换当前行
    :a;N;C!ba 把B行之前的所有行读到pattern space中
    x 交换一下,这里hold space 中是 A+1~B-1的内容,pattern space中是A行的内容
    H 把A行添加到hold space中,此时,hold space中是A+1~B-1A
    n 把B行读进pattern space中
    x 交换一下,此时,hold space中是B行,pattern space中是A+1~B-1A
    H 把A+1~B-1A添加到hold space中,此时,hold space中是 BA+1~B-1A
    x 交换一下,此时pattern space中是 BA+1~B-1A
    对于相邻行的情况

    B!{:a;N;C!ba;x;H;n} 这个部分将不执行,因为n后,当前行号就是B,因此这个部分跳过。

    示例:

    sed -n '/<module>hps-home<\/module>/{h;n;/<module>hps-framework<\/module>/!{:a;N;/<module>hps-observer<\/module>/!ba;x;H;n};x;H;x};p' pom.xml

    将pom.xml中<module>hps-home</module>行(这行在前)与<module>hps-framework</module>行(这行在后)交换位置并将交换后内容打印到标准输出(屏幕)上,其中<module>hps-observer</module>行是<module>hps-framework</module>前面的那行。

    如果要修改pom.xml文件,可以使用:

    sed -n '/<module>hps-home<\/module>/{h;n;/<module>hps-framework<\/module>/!{:a;N;/<module>hps-observer<\/module>/!ba;x;H;n};x;H;x};p' pom.xml >a.txt

    cat a.txt >pom.xml


    展开全文
  • sed

    2017-03-12 11:35:10
    sed基本用法: sed: Stream EDitor 编辑器 (全屏编辑器: vi) ...一行编辑后输出一行Sed:用法 sed [options] ‘AddressCommand’ file … -n: 静默模式,不再默认显示模式空间中的内容(–quiet –silent)...

    sed基本用法:

    sed: Stream EDitor

    行编辑器 (全屏编辑器: vi)

    sed: 模式空间

    默认不编辑原文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕;读完一行编辑后输出一行。

    Sed:用法

    sed [options] ‘AddressCommand’ file …

        -n: 静默模式,不再默认显示模式空间中的内容(–quiet –silent)

    [root@linux ~]# sed ‘/\//p’ /etc/fstab

    [root@linux ~]# sed ‘/\//p’ /etc/fstab –n

        -i: 直接修改原文件

        -e SCRIPT -e SCRIPT:可以同时执行多个脚本

    多次’AddressCommand’

        -f /PATH/TO/SED_SCRIPT

    sed -f /path/to/scripts file

        -r: 表示使用扩展正则表达式

    Address:

    1. 不给地址:对全文处理。

    2. 单地址:

    #指定的行:

    [root@linux ~]# sed ‘1d’ /etc/fstab

    /parttern/;被此处模式匹配到的行

    /^root/ 正则表达式 /RegExp/ === /Pattern/

    [root@linux ~]# sed ‘/oot/d’ /etc/fstab

    1. StartLine,EndLine 起始行

    比如1,100

    $:最后一行

    [root@linux ~]# sed ‘1,2d’ /etc/fstab

    /pattern1/,/pattern2/ 正则表达式

    第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行

    [root@linux ~]# sed ‘/\/var\>/,/\/usr\>/d’ /etc/fstab

    StartLine, +N

    从startLine开始,向后的N行;

    [root@linux ~]# sed ‘1,+2d’ /etc/fstab

    1. ~:步进

    1~2

    2~2

    [root@localhost tmp]# sed ‘1~2p’ text.txt –n

    Command:

        d: 删除符合条件的行;

    [root@linux ~]# sed ‘3,$d’ /etc/fstab

    LABEL=/ / ext3 defaults 1 1

    LABEL=/var /var ext3 defaults 1 2

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    [root@repo bin]# sed ‘/^UUID/d’ /etc/fstab

    [root@repo bin]# sed ‘/^#/d’ /etc/fstab


    [root@repo bin]# sed ‘/^$/d’ /etc/fstab


    [root@repo bin]# sed ‘/^UUID/!d’ /etc/fstab 取反了


    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        p: 显示符合条件的行;

    要打印两次,空间中的要打印出来,原来的也会打印才出来,与n结合只现实匹配到的行了。


        a \string:

    在指定的行后面追加新行,内容为string

    [root@linux ~]# sed ‘/\/\<var\>/a \#helloword’ /etc/fstab

    [root@repo bin]# sed ‘/^UUID/a \jiazi’ /etc/fstab


    \n:可以用于换行

    I与a一前一后,支持/n多行插入

    [root@linux ~]# sed ‘/\/var\>/a /####hello world \n hello linux‘ /etc/fstab

        i \string:

    在指定的行前面添加新行,内容为string

    [root@linux ~]# sed ‘/\/var\>/i /####hello world \n hello linux’ /etc/fstab

    I与a一前一后,支持/n多行插入

    [root@repo bin]# sed ‘/^UUID/a \jiazi’ /etc/fstab


    [root@repo bin]# sed ‘/^UUID/i \jiazi’ /etc/fstab

    c\string

    [root@repo bin]# sed ‘/^UUID/c \jiazi’ /etc/fstab


    UUID被替换为了jiazi

        r FILE:

    将指定的文件的内容添加至符合条件的行处

    [root@linux ~]# sed ‘/\/var\>/r /etc/issue’ /etc/fstab

    [root@linux ~]# sed ‘/\/var\>/,/\/dev\/shm\>/r /etc/issue’ /etc/fstab

        w FILE:

    将地址指定的范围内的行另存至指定的文件中;

    把/etc/fstab中从/var到 /dev段保存到/home/issue中。

    [root@linux ~]# sed ‘/\/var\>/,/\/dev\/shm\>/w /home/issue’ /etc/fstab

    把/etc/fstab中UUID开头的行写入到文件/tmp/fstab.txt中。

    [root@repo bin]# sed ‘/^UUID/w /tmp/fstab.txt’ /etc/fstab


        s/pattern/string/修饰符:

    查找并替换,默认只替换每行中第一次被模式匹配到的字符串

    s///: s###, s@@@

    \(\), \1, \2

    [root@linux ~]# sed ‘s/oot\>/OOT/’ /etc/fstab

    [root@repo bin]# sed ‘s@^UUID@uuid@’ /etc/fstab


    /=打印行号

    [root@repo bin]# sed ‘/^UUID/=’ /etc/fstab


            加修饰符

    g: 全局替换

    [root@linux ~]# sed ‘s/\//#/’ /etc/fstab

    [root@linux ~]# sed ‘s/\//#/g’ /etc/fstab

    i: 忽略字符大小写

    l..e: like–>liker

    love–>lover

    like–>Like

    love–>Love

    &: 引用模式匹配整个串

    [root@linux ~]# cat sed.txt

    hello,like

    hi, my love

    [root@linux ~]# sed ‘s#l..e#&r#g’ sed.txt

    \(\), \1, \2

    [root@linux ~]# sed ‘s#\(l..e\)#\1r#g’ sed.txt

    [root@linux ~]# sed ‘s#l\(..e\)#L\1#g’ sed.txt

    删除history行首空白

    [root@linux ~]# history | sed ‘s/^[[:space:]]\{1,\}//’

    取出/etc/rc.d /var/log父目录

    [root@repo bin]# sed ‘s@r..t@&er@’ /etc/passwd


    高级编辑命令:

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

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

    g: 从保持空间取出数据覆盖至模式空间;

    G:从保持空间取出内容追加至模式空间;

    x: 把模式空间中的内容与保持空间中的内容进行互换;

    n: 读取匹配到的行的下一行至模式空间;

    N:追加匹配到的行的下一行至模式空间;

    d: 删除模式空间中的行;

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

    sed -n ‘n;p’ FILE:显示偶数行

    sed ‘1!G;h;$!d’ FILE:逆向显示文件内容

    sed ‘$!N;$!D’ FILE: 取出文件后两行;

    sed ‘$!d’ FILE:取出文件最后一行;

    sed ‘G’ FILE:

    sed ‘/^$/d;G’ FILE:

    sed ‘n;d’ FILE: 显示奇数行;

    sed -n ‘1!G;h;$p’ FILE: 逆向显示文件中的每一行;

    sed练习:

    1、删除/etc/grub.conf文件中行首的空白符;

    <<<<<<<<<<<<<<<<<<<<<<<<<<<<有问题>>>>>>>>>>>>>>>>>>

    sed -r ‘s@^[[:spapce:]]+@@g‘ /etc/grub.conf

    <<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    sed ‘s@^[[:space:]]\{1,\}@@’ /etc/grub.conf

    sed ‘s/^[[:space:]]*//’ /etc/grub.conf

    2、替换/etc/inittab文件中”id:3:initdefault:”一行中的数字为5;

    sed ‘s@\(id:\)[0-9]\(:initdefault:\)@\15\2@g’ /etc/inittab

    sed ‘s#\(^id\>:\)[[:digit:]]\(:\<initdefault\>:\)#\15\2#’ /etc/inittab

    3、删除/etc/inittab文件中的空白行;

    sed ‘/^$/d’ /etc/inittab

    sed ‘/^$/d’ /etc/inittab

    4、删除/etc/inittab文件中开头的#号;

    sed ‘s@^#@@g’ /etc/inittab

    5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;

    sed -r ‘s@^#[[:space:]]+@@g’ /etc/inittab

    sed -r ‘s@^#[[:space:]+]@@g’ /etc/inittab

    6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#

    sed -r ‘s@^[[:space:]]+#@@g’ /etc/inittab

    sed -r ‘s@^[[:space:]]+#@@g’ /etc/inittab

    7、取出一个文件路径的目录名称;

    echo “/etc/rc.d/” | sed -r ‘s@^(/.*/)[^/]+/?@\1@g’

    echo “/etc/rc.d” | sed -r ‘s#(^/.*/)[^/]+/?#\1#g’

    基名:

    echo “/etc/rc.d/” | sed -r ‘s@^/.*/([^/]+)/?@\1@g’

    echo “/etc/rc.d” | sed -r ‘s#^/.*/([^/]+)/?#\1#g’

    #abc

    # hello world

    # hi world

    1、删除以#开头后面至少跟一个空白字符的行,删除#与空白字符。

    [root@repo bin]# sed ‘s/^#[[:space:]]\{1,\}[^[:space:]]//’ /etc/fstab | sed ‘/^#/d’ /etc/fstab

    2、echo 一个绝对路径取出其基名

    倒着删除

    [root@repo bin]# echo “/etc/sysconfig” | sed ‘s@[^/]\+/\?$@@’

    取出其文件名

    从前到后。

    [root@repo bin]# echo “/etc/sysconfig/jkl/jfdkls/” | sed ‘s@^/.*/[^/]/\?@@’ | sed ‘s@/@@’

    fdkls

    展开全文
  • sed在行首或者尾添加内容

    万次阅读 2016-01-18 17:46:40
    sed命令在行首或尾添加字符的命令有以下几种: 假设处理的文本为test.file 在每的头添加字符,比如"HEAD",命令如下: sed 's/^/HEAD&/g' test.file 在每尾添加字符,比如“TAIL”,...
  • Sed

    2015-04-20 09:55:21
    sed 是种在线编辑器,它次处理一行内容。处理时,把当前处理的存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下...
  • sed编辑器,它次处理一行内容。处理时,把 当前处理的存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,301
精华内容 12,520
关键字:

sed读第一行