您当前的位置:首页 > Linux 网站首页Linux

sed linux下编辑、替换、过滤显示操作的高级工具

转载请注明出处:黄桂林的博客 huangguilin.com

我们知道linux下有很多简单、高效、神奇的程序可以使用,linux的优点也是高效、灵活。这个可以甩windows很多条大街。

我们在日常使用linux和运维以及开发软件编写shell脚本的时候,经常要删除替换文件中的字符等,那么下面的sed的用法就会让你觉得一切都很简单,而且神奇高效。

首先还是sed的功能参数,如下:

root@MyServer:/# sed
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

  -n, --quiet, --silent
                 suppress automatic printing of pattern space
  -e script, --expression=script
                 add the script to the commands to be executed
  -f script-file, --file=script-file
                 add the contents of script-file to the commands to be executed
  --follow-symlinks
                 follow symlinks when processing in place
  -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if extension supplied)
  -l N, --line-length=N
                 specify the desired line-wrap length for the `l' command
  --posix
                 disable all GNU extensions.
  -r, --regexp-extended
                 use extended regular expressions in the script.
  -s, --separate
                 consider files as separate rather than as a single continuous
                 long stream.
  -u, --unbuffered
                 load minimal amounts of data from the input files and flush
                 the output buffers more often
      --help     display this help and exit
      --version  output version information and exit

If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret.  All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.

GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.

假设有如下的一个文本文件,我们以此文件来举例操作

line1  root  1
line2  root  2
line3  root  3
line4  root  4
line5  root  5
line6  root  6
line7  root  7
line8  root  8
line9  root  9
line10  root  10
line11  root  11
line12  root  12
line13  root  13
line14  root  14
line15  root  15
  • 增加一行 Append
 nl text.txt |sed 'a12345'
     1  line1  root  1
12345
     2  line2  root  2
12345
     3  line3  root  3
12345
     4  line4  root  4
12345
     5  line5  root  5
12345
     6  line6  root  6
12345
     7  line7  root  7
12345
     8  line8  root  8
12345
     9  line9  root  9
12345
    10  line10  root  10
12345
    11  line11  root  11
12345
    12  line12  root  12
12345
    13  line13  root  13
12345
    14  line14  root  14
12345
    15  line15  root  15
12345

12345

每一行后都会增加一行新的12345,注意最后还有一空行,那是因为文本文件最后有一行空行。

很简单,如果只在最后一行增加新数据,使用$

 nl text.txt |sed '$a12345'
     1  line1  root  1
     2  line2  root  2
     3  line3  root  3
     4  line4  root  4
     5  line5  root  5
     6  line6  root  6
     7  line7  root  7
     8  line8  root  8
     9  line9  root  9
    10  line10  root  10
    11  line11  root  11
    12  line12  root  12
    13  line13  root  13
    14  line14  root  14
    15  line15  root  15

12345

第一行就不能是 0a,而是使用了另外的一个操作i,insert,使用1i

nl text.txt |sed '1i12345'
12345
     1  line1  root  1
     2  line2  root  2
     3  line3  root  3
     4  line4  root  4
     5  line5  root  5
     6  line6  root  6
     7  line7  root  7
     8  line8  root  8
     9  line9  root  9
    10  line10  root  10
    11  line11  root  11
    12  line12  root  12
    13  line13  root  13
    14  line14  root  14
    15  line15  root  15

  • 删除 d  delete

删除第二行

 nl text.txt  | sed '2d'
     1  line1  root  1
     3  line3  root  3
     4  line4  root  4
     5  line5  root  5
     6  line6  root  6
     7  line7  root  7
     8  line8  root  8
     9  line9  root  9
    10  line10  root  10
    11  line11  root  11
    12  line12  root  12
    13  line13  root  13
    14  line14  root  14
    15  line15  root  15

删除第三行及以后

 nl text.txt  | sed '3,$d'
     1  line1  root  1
     2  line2  root  2

所以聪明的你马上知道,如果要删除区间,行号间隔内的内容,就是用  L1,L2d

 nl text.txt  | sed '3,5d'
     1  line1  root  1
     2  line2  root  2
     6  line6  root  6
     7  line7  root  7
     8  line8  root  8
     9  line9  root  9
    10  line10  root  10
    11  line11  root  11
    12  line12  root  12
    13  line13  root  13
    14  line14  root  14
    15  line15  root  15

  • 多行替换
 nl text.txt  | sed '3,5cThese Lines was Replaced'
     1  line1  root  1
     2  line2  root  2
These Lines was Replaced
     6  line6  root  6
     7  line7  root  7
     8  line8  root  8
     9  line9  root  9
    10  line10  root  10
    11  line11  root  11
    12  line12  root  12
    13  line13  root  13
    14  line14  root  14
    15  line15  root  15

  • 数据的搜索显示,类似于grep
nl text.txt  | sed -n '/line5/p'
     5  line5  root  5
  • 模式匹配相应的行,并删除
 nl text.txt  | sed  '/line5/d'
     1  line1  root  1
     2  line2  root  2
     3  line3  root  3
     4  line4  root  4
     6  line6  root  6
     7  line7  root  7
     8  line8  root  8
     9  line9  root  9
    10  line10  root  10
    11  line11  root  11
    12  line12  root  12
    13  line13  root  13
    14  line14  root  14
    15  line15  root  15

  • 匹配并执行操作
 找到line5,并将line5替换Wierow5
nl text.txt  | sed  '/line5/{s/line5/row5/;p}'
     1  line1  root  1
     2  line2  root  2
     3  line3  root  3
     4  line4  root  4
     5  row5  root  5
     5  row5  root  5
     6  line6  root  6
     7  line7  root  7
     8  line8  root  8
     9  line9  root  9
    10  line10  root  10
    11  line11  root  11
    12  line12  root  12
    13  line13  root  13
    14  line14  root  14
    15  line15  root  15
  • 搜索数据并替换
sed的模式匹配,sed 的搜寻与替代的与 vi 相当的类似,如下
sed 's/要被取代的字串/新的字串/g'

 # nl text.txt  | sed  's/line3/line888/g'
     1  line1  root  1
     2  line2  root  2
     3  line888  root  3
     4  line4  root  4
     5  line5  root  5
     6  line6  root  6
     7  line7  root  7
     8  line8  root  8
     9  line9  root  9
    10  line10  root  10
    11  line11  root  11
    12  line12  root  12
    13  line13  root  13
    14  line14  root  14
    15  line15  root  15

  • 一条命令,多条编辑操作
使用 -e 将第6行以后的删除,并替换 line3 为 line888

nl text.txt  | sed  -e '6,$d' -e 's/line3/line888/g'
     1  line1  root  1
     2  line2  root  2
     3  line888  root  3
     4  line4  root  4
     5  line5  root  5
  • 直接修改文件 -i
sed  -i 's/line3/line888/g' text.txt


cat text.txt
line1  root  1
line2  root  2
line888  root  3  //已被修改
line4  root  4
line5  root  5
line6  root  6
line7  root  7
line8  root  8
line9  root  9
line10  root  10
line11  root  11
line12  root  12
line13  root  13
line14  root  14
line15  root  15

最后还有编程中会用到的,变量替换,使用变量值进行替换

 sed替换变量

写脚本时会用到的sed,一般在sed 中替换都用单引号,但变量替换用双引号如下

 line=999
echo $line
sed -i "s/line9/$line/g" text.txt

cat text.txt
line1  root  1
line2  root  2
line888  root  3
line4  root  4
line5  root  5
line6  root  6
line7  root  7
line8  root  8
999  root  9
line10  root  10
line11  root  11
line12  root  12
line13  root  13
line14  root  14
line15  root  15

注意第九行line999已被替换为999
注意单双引号的区别,单引号将作为字符串替换双引号才会作为变量替换,有点类似于php对单双引号的解释

 

转载请注明出处:黄桂林的博客
转载请注明出处:黄桂林的博客

关键字linux / sed /