linux shell 脚本攻略学习19--sed命令详解

时间:2022-02-08 15:20:45

sed(意为流编辑器,英语“stream editor”的缩写)是Unix/linux常见的命令行程序。sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出,即文本替换。sed通常用来匹配一个或多个正则表达式的文本进行处理。

输入sed --help查看帮助信息:

amosli@amosli-pc:~/learn/sed$ sed --help
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.

语法:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]...

参数-实例:

测试文件:test.txt

amosli@amosli-pc:~/learn/sed$ cat test.txt
hi,this is sed command test file
linux world is so amazing you will like it!

1.简单的文本替换

常用格式:

sed 's/pattern/replace_string'  file
#或者
cat file | sed 's/pattern/replace_string' file

其中pattern为模式,replace_string为替换词.即,将符合pattern的字符串替换为replace_string .

例:将will变为大写WILL

amosli@amosli-pc:~/learn/sed$ sed "s/will/WILL/" test.txt
hi,this is sed command test file
linux world is so amazing you WILL like it!

使用标准输入:

amosli@amosli-pc:~/learn/sed$ echo "this is test" | sed "s/test/TEST/"
this is TEST

2.-i参数,将替换结果应用于原文件

默认情况下sed不会修改原文件,因为式作原理为:sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

amosli@amosli-pc:~/learn/sed$ sed -i 's/like/LOVE/' test.txt
amosli@amosli-pc:~/learn/sed$ cat test.txt
hi,this is sed command test file
linux world is so amazing you will LOVE it!

英文提示信息:

 -i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)

3、关于后缀/g

/g默认表示替换所有符合条件的文本。

amosli@amosli-pc:~/learn/sed$ echo "test1 test2 test3 test4 " | sed "s/test/TEST/g"
TEST1 TEST2 TEST3 TEST4

/Ng表示从第N个符合条件的开始替换.

amosli@amosli-pc:~/learn/sed$ echo "test1 test2 test3 test4 " | sed "s/test/TEST/3g"
test1 test2 TEST3 TEST4

4、关于字符'/'

字符‘/’在sed命令中扮演着定界符的作用,'|'和':'的作用和'/'一样,可以做为定界符使用

如:

amosli@amosli-pc:~/learn/sed$ echo "test1 test2 test3 test4 " | sed "s:test:TEST:g"
TEST1 TEST2 TEST3 TEST4
amosli@amosli-pc:~/learn/sed$ echo "test1 test2 test3 test4 " | sed "s|test|TEST|g"
TEST1 TEST2 TEST3 TEST4

当定界符出现在样式内部中,可以使用前缀\对它进行转义,如:

amosli@amosli-pc:~/learn/sed$ echo "te/st1 te/st2 te/st3 te/st4 " | sed "s/test/TEST/g"
te/st1 te/st2 te/st3 te/st4

这样替换就失效了,使用前缀\进行转义

amosli@amosli-pc:~/learn/sed$ echo "te/st1 te/st2 te/st3 te/st4 " | sed "s/te\/st/TEST/g"
TEST1 TEST2 TEST3 TEST4

5.移除空白行

amosli@amosli-pc:~/learn/sed$ sed '/^$/d' test.txt
hi,this is sed command test file
linux world is so amazing
you will LOVE it!

/pattern/d 会移除匹配样式的行

^$行尾标记紧临表示空白行。

6.&代表已经匹配的字符串

amosli@amosli-pc:~/learn/sed$ echo this is a test | sed 's/\w\+/[&]/g'
[this] [is] [a] [test]

\w\+ 正则表达式表示匹配每一个单词,&对应于之前所匹配到的单词,使用[&]进行替换。

7.子串匹配字符口中\1

amosli@amosli-pc:~/learn/sed$ echo this is digit  in a number | sed 's/digit \([0-9]\)/\1/'
this is in a number

这条命令将digit 7 替换为7,\(pattern\) 用于匹配子串,模式被包含在使用生命线转义过的()中。对于匹配到的第一个子串,其对应的标记是\1,匹配到的第二个子串为\2,以次类推。

8.组合多个表达式

amosli@amosli-pc:~/learn/sed$ cat test.txt
hi,this is sed command test file
linux world is so amazing you will LOVE it!
amosli@amosli-pc:~/learn/sed$ cat test.txt | sed 's/linux/LINUX/' | sed 's/sed/SED/'
hi,this is SED command test file
LINUX world is so amazing you will LOVE it!

也可以使用:

amosli@amosli-pc:~/learn/sed$ cat test.txt | sed "s/linux/LINUX/; s/sed/SED/"
hi,this is SED command test file
LINUX world is so amazing you will LOVE it!

格式为:

sed 'expression' | sed 'expression'
#or
sed 'expression;expression'

9.引用

定义变量:

amosli@amosli-pc:~/learn/sed$ txt=hello

引用变量:

amosli@amosli-pc:~/learn/sed$ echo "hello world" | sed "s/$txt/HELLO/g"
HELLO world

10.可选参数:

 命令  功能
 a\

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

 c\  用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
 i\  在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
 d  删除行
 h  把模式空间里的内容复制到暂存缓冲区
 H  把模式空间里的内容追加到暂存缓冲区
 g  把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
 G  把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
 l  列出非打印字符
 p  打印行
 n  读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
 q  结束或退出sed
 r  从文件中读取输入行
 !  对所选行以外的所有行应用命令
 s  用一个字符串替换另一个
 g  在行内进行全局替换
   
 w  将所选的行写入文件
 x  交换暂存缓冲区与模式空间的内容
 y  将字符替换为另一字符(不能对正则表达式使用y命令)

其他选项:

 选项     功能
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出
-f 指定sed脚本的文件名

元字符总结:

 元字符  功能  示例
 ^  行首定位符  /^my/  匹配所有以my开头的行
 $  行尾定位符  /my$/  匹配所有以my结尾的行
 .  匹配除换行符以外的单个字符  /m..y/  匹配包含字母m,后跟两个任意字符,再跟字母y的行
 *  匹配零个或多个前导字符  /my*/  匹配包含字母m,后跟零个或多个y字母的行
 []  匹配指定字符组内的任一字符  /[Mm]y/  匹配包含My或my的行
 [^]  匹配不在指定字符组内的任一字符  /[^Mm]y/  匹配包含y,但y之前的那个字符不是M或m的行
 \(..\)  保存已匹配的字符  1,20s/\(you\)self/\1r/  标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
 &  保存查找串以便在替换串中引用  s/my/**&**/  符号&代表查找串。my将被替换为**my**
 \<  词首定位符  /\<my/  匹配包含以my开头的单词的行
 \>  词尾定位符  /my\>/  匹配包含以my结尾的单词的行
 x\{m\}  连续m个x  /9\{5\}/ 匹配包含连续5个9的行
 x\{m,\}  至少m个x  /9\{5,\}/  匹配包含至少连续5个9的行
 x\{m,n\}  至少m个,但不超过n个x  /9\{5,7\}/  匹配包含连续5到7个9的行