您当前的位置:首页 > 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对单双引号的解释
转载请注明出处:黄桂林的博客
转载请注明出处:黄桂林的博客