sed的基本用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed的基本用法相关的知识,希望对你有一定的参考价值。

参考技术A sed -n 'n,p' FILE:  显示偶数行

sed '1!G;h;$!d' file  逆序显示文件内容

sed '$!d' file 取出最后一行

sed '$!N;$!D' 显示最后两行

sed '/^$/d;G'  /etc/fstab 删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;

sed 'n;d' FILE 显示奇数行

********************************************************************************************************

sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。

处理时,先把当前处理的行内容存储在临时缓冲区中,称为“模式空间”(pattern space),

之后再用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容打印到屏幕。

接着处理下一行,这样不断重复,直到文件末尾。

注意:模式空间的内容和 AWK 中的 $0 是一样的,处理每行的时候,都会被重新赋值为当前行的内容

文件内容并没有改变,除非你使用重定向存储输出。

Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

创建一个文件

options 选项是可选的,意思就是没有也行

        与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是

        括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。

        使用基本元字符集 ^, $, ., *, [], [^], \< \>,\(\),\\

        使用扩展元字符集 ?, +, , |, ( )使用扩展元字符的方式:

        sed  -r

        在实际使用的时候,都会加上 -r 参数,即使没有用的扩展正则也不会有任何影响。

打印

sed  默认会输出文件的每一行,无论这行内容是否能匹配上匹配模式,假如被匹配到的则会再输出一次

p 是 sed 的内部命令,是 打印(输出) 的作用

屏蔽默认输出使用 -n 选项

搜索替换 -- 这是重点 实际中用的最多

当在模式匹配中使用其他界定符号时,需要对其进行转义。

其他界定符用在 s 搜索替换时不必转义。例如:

地址用于决定对哪些 行 进行编辑。地址形式可以是数字、正则表达式或二者的结合。如果没有指定地址,sed将处理输入文件中的所有行。

$  表示最后一行

       - 开头和结尾之间什么都没有的行

       - 开头和结尾之间有多个空格的行

       - 开头和结尾之间有多个  Tab 键的行

以下 3 中效果一样,挑一个自己喜欢的

使用小括号进行分组,可以有多个分组, 后面可以使用 \1 获取到第一个分组的内容

***************************************************************************

sed -r '$a IPADDR=192.168.40.100\nNETMASK=255.255.255.0\nGATEWAY=192.168.40.1' /etc/sysconfig/network-scripts/ifcfg-ens33

sed基本用法

 1. 文本处理

  sed编辑器根据sed命令处理数据流中的数据;在流编辑器将所有命令与一行数据匹配完后,它会读取下一行数据并重复以下过程:

    (1) 一次从输入中读取一行数据

    (2) 根据所提供的编辑器命令匹配数据

    (3) 按照命令修改流中的数据

    (4) 将新的数据输出到STDOUT

  格式:

    sed options script-command input-file

  选项:

-e script

在script中指定命令

-f file

从file文件中读取命令

-n

不产生命令输出,使用print命令完成输出

-i

将修改应用到文件

=

打印行号,行号由换行符决定

l

打印数据流中的文本和不可打印的ASCII字符

   命令:

s

替换行

sed ‘[address]/s/pattern/replacement/flags‘

d

删除行

sed ‘[address]command‘

i/a

插入/追加行

sed ‘[address]command\new line‘

c

修改行

sed ‘[address]command\new line‘

y

转换单字符

sed ‘[address]y/inchars/outchars/‘

w

写入行

sed ‘[address]w test.file‘ date.txt

r

读取行

sed ‘[address]r test.file‘ date.txt

 

  定义编辑器命令:

    # echo "this is a test" | sed ‘s/test/big test/‘

    this is a big test

  使用多个编辑器命令:

    # echo "this is a test" | sed ‘s/test/big test/;s/this/here/‘

    here is a big test

  从文件中读取编辑器命令:

    #sed -f script1.sed data1.txt

  Tips:sed编辑器不会修改文本文件的数据,只会将修改后的数据发送到STDOUT;若想修改,可使用-i选项

 

2. sed编辑器基础 

【行寻址】

  将命令作用于特定行和某些行

  格式1:

    [address] command

  格式2:

    address {

      command1

      command2

      command3

    }

  数字方式的行寻址:

    最后一行的行号可使用$代替

    # sed ‘2s/dog/cat/‘ data.txt

    # sed ‘2,3s/dog/cat/‘ data.txt

    # sed ‘2,$s/dog/cat/‘ data.txt

  文本模式过滤器:

  /pattern/command

    # sed -n ‘/kim/s/bash/cash/p‘ /etc/passwd

    kim:x:1001:1001::/home/kim:/bin/cash

    Tips:使用正则表达式,可创建高级文本模式匹配表达式来匹配各种数据

  命令组合:

    可用花括号{}将多条命令组合在一起,行寻址方式如格式2

    # sed ‘/two/{s/quick/slow/;s/dog/cat/}‘ data.txt

【替换】

  格式:

    sed ‘[address]/s/pattern/replacement/flags‘

  替换选项:

    s命令(substitude)可在行中替换文本,默认仅替换第一处

  替换标记:

  s/pattern/replacement/flags

    (1) 数字,表明替换第几处

    (2) g,替换所有

    (3) p,原先行的内容要打印出来(先打印修改的行,结合-n选项可实现只输出修改的行)

    (4) w file,替换结果写入文件

      # cat data.txt

      This is a test line.

      This is a different line.

      # sed ‘s/test/trail/w file.txt‘ data.txt

      This is a trail line.

      This is a different line.

      # cat file.txt

      This is a trail line.

  替换字符:

    sed允许选择其它字符来作为替换命令中的字符串分隔符

      # sed -n ‘s!/bin/bash!/bin/csh!p‘ /etc/passwd

      root:x:0:0:root:/root:/bin/csh

      fonsview:x:1000:1000::/home/fonsview:/bin/csh

    Tips:  替换命令结合正则表达式中的回溯引用,可实现删除一行中的特定部分

      # echo "math: a+b=c" | sed -e ‘/math/s/\(.*=\).*/\1ab/‘

      math: a+b=ab

【删除行】

  格式:

    sed ‘[address]command‘

  删除文本流中的特定行,可以用删除命令d

    # sed ‘/two/,/three/d‘ data.txt

    The quick brown fox jumps over the lazy dog one     

    The quick brown fox jumps over the lazy dog four

【插入和追加行】

  格式:

    sed ‘[address]command\new line

    (1) 插入insert会在指定行前增加新行,命令i

    (2) 追加append会在指定行后增加新行,命令a

      # sed ‘1i\hello,\world!‘ data.txt

      # sed ‘/two/i\hello,world!‘ data.txt  

【修改行】

  修改(change)命令允许修改数据流中整行文本的内容

  格式:

    sed ‘[address]command\new line

    # sed ‘1c\dog‘ data.txt

    # sed ‘/two/c\dog\cat‘ data.txt

【转换】

  格式:

    sed ‘[address]y/inchars/outchars/‘

  转换(transform)命令(y)是唯一可以处理单个字符的sed命令,对inchars和outchars进行一对一映射

    # sed ‘y/1234/abcd/‘ data.txt    

    The quick brown fox jumps over the lazy dog a one     

    The quick brown fox jumps over the lazy dog b two

    The quick brown fox jumps over the lazy dog c three

    The quick brown fox jumps over the lazy dog d four

【写入文本】

  格式:

    sed ‘[address]w test.file‘ date.txt

    # sed -n ‘/one/,/three/w text.txt‘ data.txt

    # cat text.txt

    The quick brown fox jumps over the lazy dog 1 one     

    The quick brown fox jumps over the lazy dog 2 two

    The quick brown fox jumps over the lazy dog 3 three

【读取数据】

  读取(read)命令允许你将一个独立文件中的数据插入到数据流中,指定的地址行之后

  格式:

    sed ‘[address]r test.file‘ date.txt

    # sed ‘2r text.txt‘ data.txt

    The quick brown fox jumps over the lazy dog 1 one     

    The quick brown fox jumps over the lazy dog 2 two

    hello,world!

    The quick brown fox jumps over the lazy dog 3 three

    The quick brown fox jumps over the lazy dog 4 four

 

以上是关于sed的基本用法的主要内容,如果未能解决你的问题,请参考以下文章

sed基本用法:修改行

sed的基本用法和高级用法

sed的基本用法

sed的基本用法

linux中行编辑器sed的基本用法

sed基本用法