Linux sed命令完全攻略(超级详细):https://c.biancheng.net/view/4028.html
Linux awk 命令详解:https://c.biancheng.net/view/4082.html
Linux grep命令详解:查找文件内容:https://c.biancheng.net/view/4017.html
1、sed 命令
sed 简介
Vim 采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据中的文本。但 sed 命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。所以,sed (Stream Editor) 是一个 "非交互式的" 面向字符流的文本流编辑器。
sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:
- 每次仅读取一行内容;
- 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
- 将执行结果输出。
sed 主要是 以行为单位 进行处理,在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。可以对数据行进行 "增、删、改、查" 等操作。支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。
sed 命令行格式为 :(命令 必须以 '' 单引号引起来)
- sed [OPTION]... {script-only-if-no-other-script} [input-file]...
- sed [选项] -f sed脚本文件 输入文件
- sed [-hnV] [-e <script>] [-f <script文件>] [文本文件]
组合多个表达式:sed '表达式' | sed '表达式' 等价于:sed '表达式; 表达式'
sed 命令常用选项及含义
- -e 脚本命令 该选项会将其后跟的脚本命令添加到已有的命令中。
- -f 脚本命令文件 该选项会将其后文件中的脚本命令添加到已有的命令中。
- -n 默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
- -i 此选项会直接修改源文件,要慎用。
sed 常用 "选项、命令"
sed 常用 选项。查看 sed 选项:sed --help
- -n 或 --quiet 或 --silent 安静模式,sed 默认会输出所有文本内容,-n 表示只显示处理过的行
cp /etc/passed /data
cd /data
sed 's/:/\n/p' passwd | sed '1~2p'
sed -n 's/:/\n/p' passwd | sed -n '1~2p'
sed -n 's/:.*//gp' /etc/passwd- -e <script> 或 --expression=<script> 告诉 sed 将下一个参数解释为一个 sed 指令,只有当命令行上给出多个sed指令时才需要使用 -e 选项
- -f <script文件> 或 --file=<script文件> 后跟保存了 sed 指令的文件,以选项中指定的 script 文件来处理输入的文本文件。sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,
如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
sed [options] -f scriptfile file(s)- -h 或 --help 显示帮助。
- -i:直接对内容进行修改,不加 -i 时默认只是预览,不会对文件做实际修改
- -r:支持扩展正则表达式。(默认是基础正则表达式)
- -i∶直接修改读取的档案内容,而不是由萤幕输出。
- -V 或 --version 显示版本信息。
sed 常用 命令。man sed:https://www.man7.org/linux/man-pages/man1/sed.1.html
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
- c :替换, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行。或者 整行替换
- d :删除,因为是删除,所以 d 后面什么都没有;
D 删除模板块的第一行。- g :获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。- h :拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。- i :插入。后面可以接字串,而这些字串会在新的一行出现(当前行的的上一行); (会修改原始文件,谨慎使用);
- l :列出不能打印字符的清单。
- n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
打印奇数行或偶数行
方法1:
sed -n 'p;n' test.txt #奇数行
sed -n 'n;p' test.txt #偶数行
方法2:
sed -n '1~2p' test.txt #奇数行
sed -n '2~2p' test.txt #偶数行- p :打印模板块的行。亦即将某个选择的数据印出。通常 p 会与参数sed -n 一起使用
P(大写) 打印模板块的第一行- s :同一行内进行替换,不能跨行。s 通常是和正则表达式。例如 1,20s/old/new/g
- = :输出行号
- r :将文件的内容读入 read
- w :将文本写入文件 write
- q :退出 Sed
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,
将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,
将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
sed 执行流程
sed 编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed 在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed 处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。处理完文件的最后一行,sed 便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明 -i 选项。
sed 执行原理
- g :获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。 - h :拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
将文件的内容逆序输出。下面是命令的详细解释:sed '1!G;h;$!d' num.txt
1!G
:对于第一行之外的所有行,执行G
命令,将模式空间中的内容与保持空间(暂存区)中的内容进行交换。这样做会将当前行追加到保持空间中。h
:将模式空间中的内容复制到保持空间中,覆盖原来的内容。这样做是为了保留每行的顺序。$!d
:对于最后一行之外的所有行,删除模式空间中的内容,即只保留最后一行。
这个命令会将 num.txt
文件的内容以逆序输出。它将最后一行作为起始行,并依次向上输出每一行,直到第一行。这样就实现了逆序输出的效果。
模式空间(pattern space)、暂存空间(hold space)
保持和获取:h命令和G命令
在 sed 处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
示例:sed -e '/test/h' -e '$G' file
解释:匹配 test 的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
保持和互换:h命令和x命令
互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:sed -e '/test/h' -e '/check/x' file
n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
!对所选行以外的所有行应用命令。d 删除模式空间的内容并导致读入新的输入行,从而在脚本的顶端重新使用编辑方法
D 删除模式空间中直到第一个嵌入的换行符的这部分内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用于模式空间剩余的内容
注意:暂存空间里默认存储一个空行。
2!G 不是第二行的时候进行G操作
$!d 不是最后一行的时候进行d操作,是最后一行就不进行d操作
行号是 sed 读取文件里的第几行
sed 2种操作方式:行操作、模式匹配 操作
"增、删、改、查" 都有下面2种方式进行操作。
- 根据行号:
- 模式匹配
a 追加 的两个操作示例:
- 根据行号 追加:sed '1a aaaaa' /etc/fstab 在第一行下新起一行追加后面的字符串
- 根据模式匹配 追加:sed '/boot/r aaaaa' /etc/fstab 在包含boot的行下面追加后面的字符串
sed -i '$a bye' test_file.txt 在文件 test_file.tx 中最后一行直接输入"bye"
正则 元字符
- sed 使用正则 替换: sed 's/字符串1/字符串2/标志位'
- 替换匹配行中的某个字符串
sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename - sed 使用正则 查找: sed '/字符串1/标志位'
示例:在所有三位数字后面加个0
命令:sed -nr 's/\<[0-9]{3}\>/&0/gp' /etc/passw
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符。
如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符。如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
>/ 匹配单词的结束,如:/love\>匹配包含以love结尾的单词的行。
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
标志位:g、p、w、x、y、\1、&
g 表示行内全部替换。如果不加则表示只替换匹配到的第一个 。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记
& 表示 已匹配字符串标记
echo 'I have a fat cat' | sed 's/.at/".at"/g'
echo 'I have a fat cat' | sed 's/.at/"&"/g'
子串匹配标记 \1 匹配给定样式的其中一部分:
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
this is 7 in a number
命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,\(..\) 用于匹配子串,
对于匹配到的第一个子串就标记为 \1,依此类推匹配到的第二个结果就是 \2,例如:
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
BBB aaa
love被标记为1,所有loveable会被替换成lovers,并打印出来:
sed -n 's/\(love\)able/\1rs/p' file
sed 单引号、双引号
"sed的表达式(模式)" 可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。
test=hello
echo hello WORLD | sed "s/$test/HELLO"
HELLO WORLD
正确 示例:sed -n "${a},${b}p" /etc/passwd
错误 示例:sed -n '${a},${b}p' /etc/passwd
示例:sed 编辑 命令
简单示例
- sed -n 's/:/\n/p' passwd | sed -n '1~2p' sed 取出/etc/passwd文件的第一列
- sed -n 's/:/\\n/gp' path.txt 将PATH环境变量中的冒号换成换行 \n
- sed -i 's/\//\\/g' path.txt 将PATH环境变量斜杠/换成斜杠\
- sed '/^games/ s/$/test_test/p' passwd 修改games 开头的行,结尾修改成 test_test
- sed -n 's/:x:/::/pg' passwd 去掉 /etc/passwd 文件中第二个字段的x
示例:sed -i 's/^#\s*Port\s\+\S\+$/Port 8889/' ssh_config
将以 # Port
开头的行替换为 Port 8889
,而保留其他配置项不变:
^#\s*Port\s\+\S\+$
表示匹配以#
开头,后面有零个或多个空格,然后是Port
关键字,后面再跟一个或多个非空白字符(即原始端口号),最后以行尾结束。这个正则表达式确保只匹配注释掉的原始端口号配置项。s
命令将匹配的字符串替换为Port 8889
,实现端口号的修改。-i
参数表示直接修改文件内容,而不是在屏幕上输出结果。
示例:正则 查找 行
- sed 正则 替换: sed 's/old_string/new_string/标志位' 其中 old_string 可以用正则表达式
- sed 正则 查找: sed '/find_string/标志位'
示例:sed -n '/ruby/p' ab | sed 's/ruby/bird/g' # 查找ruby的行,然后替换ruby为bird
示例:sed -n '/ruby/p' ab | sed 's/ruby//g' # 查找ruby的行,然后删除ruby
示例:查询包括关键字 root 的所有行
命令:sed -n '/root/p' /etc/passwd
打印行号:sed -n '=' /etc/passwd | sed 'N; s/\n/ /'
sed -n '=' test.txt
命令用于打印每一行的行号。sed 'N; s/\n/ /'
命令用于将行号和对应的文本合并到一行,并用空格分隔行号和文本。
示例:, (逗号):选定行的范围
示例文件:cat test_file.txt #查看 test_file.txt 中的内容
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
Google
Taobao
Runoob
Tesetfile
Wiki
- sed -n '/Google/,/Tesetfile/p' test_file.txt 在 Google 和 Tesetfile 之间的行都打印出来
- sed -n '2,/^Google/p' test_file.txt 打印从第2行开始到第一个包含以Google开始的行之间的所有行
- sed '/Google/,/Runoob/s/$/aaa bbb/' test_file.txt 对于Google和Runoob之间的行,每行的末尾用字符串aaa bbb替换
示例:p 命令 (print 打印)
q 退出命令,打印完第10行后退出:sed sed '10q' file
显示某行
sed -n '1p' test_file.txt # 显示第一行
sed -n '$p' test_file.txt # 显示最后一行
sed -n '1,2p' test_file.txt # 显示第一行到第二行
sed -n '2,$p' test_file.txt # 显示第二行到最后一行sed -n '5p' /etc/passwd # 显示第5行
sed -n '1,5p' /etc/passwd # 显示第1至5行
sed -n '1p;5p' /etc/passwd # 显示第1行和第5行
cat -n /etc/passwd | sed -n '5,100!p' # 取反,取1到4行
sed -n '2,+2p' /etc/passwd # 显示第2行和其后面两行
sed -n '$p' /etc/passwd # 显示最后一行
sed -n '1~3p' /etc/passwd # 从第一行起,每间隔3行输出一行
打印匹配字符串的下一行
grep -A 1 SCC URFILE
sed -n '/SCC/{n;p}' URFILE
awk '/SCC/{getline; print}' URFILE
示例:s 命令 (string 行操作)
- s后面的 是界定符,如果省略,默认是 /
- 同一行内进行替换,不能跨行。s 通常是和正则表达式。例如 1,20s/old/new/g
定界符
s命令后面紧跟的 / 在sed中作为定界符使用,也可以使用任意的定界符:
sed 's:test:TEXT:g'
sed 's|test|TEXT|g'
定界符出现在样式内部时,需要进行转义:
sed 's/\/bin/\/usr\/local\/bin/g'
s 命令 可以使用任意分隔符作为定界符
以 / 作为 分隔符
sed -n '/^hello/s/\/bin\/bash/\/sbin\/nologin/p' /etc/passwd
以 | 作为 分隔符
sed -n '/^hello/s|/bin/bash|/sbin/nologin|p' /etc/passwd
以 :作为 分隔符
sed -n '/^hello/s:/bin/bash:/sbin/nologin:p' /etc/passwd
sed 的 s 命令中支持 \t \n
sed -n 's/^xixi/\n1111111111111111/p' /etc/passwd
sed -n 's/^xixi/\t1111111111111111/p' /etc/passwd
sed 's/^abrt.*/&\n/' passwd
替换操作:s 命令
替换文本中的字符串:
sed 's/book/books/' file
-n 选项和 p命令 一起使用表示只打印那些发生替换的行:
sed -n 's/test/TEST/p' file
直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books:
sed -i 's/book/books/g' file
全面替换标记g 使用后缀 /g 标记会替换每一行中的所有匹配:
sed 's/book/books/g' file
当需要从第N处匹配开始替换时,可以使用 /Ng:
echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/3g'
skskSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK
sed -n '2,10s/^/#/p' passwd 在2到10行前面加上注释
sed -n 's/$/?/p' passwd 在每行末尾加上?
将/etc/selinux/config的SELINUX参数改为disabled:sed -n '/^SELINUX=/s|enforcing|disabled|p' /etc/selinux/config s后面的 是界定符,如果省略,默认是 /
示例:c 命令 (change 修改)
更改整行操作可以根据行号和模式匹配进行操作
- 修改 符合条件的行:sed '/id:/c id:5:initdefault:' /etc/inittab 将 id:所在的行整行替换成后面的字符串
- 直接修改整行:
sed '3c ONBOOOT=no' ifcfg-eth0 将第3行改成后面的字符串
sed '1,2c Hi' ab 第一行到第二行代替为Hi
示例:r 命令 (read 读入)
在 fstab 文件的末尾后面读入hosts文件的内容
sed '$r /etc/hosts' /etc/fatab
df -h | sed '/dev/sda1/r /etc/mtab'
从文件读入:r命令
file里的内容被读进来,显示在与test匹配的行后面,
如果匹配多行,则file的内容将显示在所有匹配行的下面:
sed '/test/r file' filename
写入文件:w命令
在example中所有包含test的行都被写入file里:
sed -n '/test/w file' example
示例:a 命令 (append 追加)
- 根据行号 追加:sed '1a aaaaa' /etc/fstab 在第一行下新起一行追加后面的字符串
- 根据模式匹配 追加:sed '/boot/r aaaaa' /etc/fstab 在包含boot的行下面追加后面的字符串
追加(行下):a\命令
将 this is a test line 追加到 以test 开头的行后面:
sed '/^test/a\this is a test line' file
在 test.conf 文件第2行之后插入 this is a test line:
sed -i '2a\this is a test line' test.conf
sed '1a drink tea' ab #第一行后增加字符串"drink tea"
sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
示例:i 命令 (编辑)
会修改原始文件,谨慎使用!!!
sed '$i 1111111111111' /etc/fstab 在最后一行的前面插入后面的字符串
sed '/defaults/i 1111111111111' /etc/fstab 在包含defaults的行前面插入后面的字符串
插入(行上):i\命令
将 this is a test line 追加到以test开头的行前面:
sed '/^test/i\this is a test line' file
在test.conf文件第5行之前插入this is a test line:
sed -i '5i\this is a test line' test.conf
-i
参数表示直接修改文件内容,而不是在屏幕上输出结果。/p
参数用于打印匹配的行- 同时使用时,因为
-i
参数已经将结果写回了文件,所以/p
参数并不会产生任何效果
示例:d 命令 (delete 删除)
删除某行
sed '1d' ab # 删除第一行
sed '$d' ab # 删除最后一行
sed '1,2d' ab # 删除第一行到第二行
sed '2,$d' ab # 删除第二行到最后一行
sed '3,5d' /etc/fstab 删除第3到5行
sed '/2/d' /etc/fstab 删除包含2的行
sed '/ext3/!d' /etc/fstab 除了包含ext3的行都删删除空行和注释
sed -r '/^$|^#/d' /etc/inittab
sed -e '/^$/d' -e '/^#/d' /etc/inittab
sed -r '/^$/d;/^#/d' /etc/inittab
删除操作:d命令
删除空白行:
sed '/^$/d' file
删除文件的第2行:
sed '2d' file
删除文件的第2行到末尾所有行:
sed '2,$d' file
删除文件最后一行:
sed '$d' file
删除文件中所有开头是test的行:
sed '/^test/'d file
示例:e 命令 ( 多点 编辑 )
多点编辑:e命令
-e选项允许在同一行里执行多条命令:
sed -e '1,5d' -e 's/test/check/' file
上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。
命令的执行顺序对结果有影响。如果两个命令都是替换命令,
那么第一个替换命令将影响第二个替换命令的结果。
和 -e 等价的命令是 --expression:
sed --expression='s/test/check/' --expression='/love/d' file
示例: N 命令
编辑一个文件 test.txt,内容如下:
0.0.0.0
1.1.1.1
2.2.2.2
输出以下形式:
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80
命令:sed -i 'N;N;s/\n/:80,/g;s/$/:80/' test.txt
-i
:表示原地编辑,即直接修改文件内容。'N;N;s/\n/:80,/g;s/$/:80/'
:这是sed
的脚本部分。在这个脚本中,首先使用N;N
命令读取两行文本(将两行文本缓存起来),然后使用替换命令s/\n/:80,/g
将每行中的换行符\n
替换为:80,
,最后使用s/$/:80/
在每行末尾添加:80
。该命令将会将
test_file.txt
中的内容进行修改,并将每两行文本之间的换行符替换为:80,
,并在每行末尾添加:80
。
sed 标签
标签:sed 使用圆括号定义替换模式中的部分字符;相当于python里的正则分组
标签可以方便在后面引用,每行指令最多添加9个指令,相当于python里的引用分组
sed -r 's/(^[[:alnum:]]+)(.*)/\1/' /etc/passwd
sed -r 's/(^[[:alnum:]]+)(.*)/\2/' /etc/passwd
echo aaa bbb ccc | sed -r 's/([a-z]+)([a-z]+)([a-z]+)/\3 \2 \1/'
搜索、显示
搜索 /etc/passwd 有 root 关键字的行:nl /etc/passwd | sed '/root/p'
使用 -n 的时候将只打印包含模板的行:nl /etc/passwd | sed -n '/root/p'
搜索、删除
删除 /etc/passwd 所有包含 root 的行,其他行输出:nl /etc/passwd | sed '/root/d'
搜索、执行命令
搜索 /etc/passwd,找到 root 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 bash 替换为 blueshell,再输出这行:nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
如果只替换 /etc/passwd 的第一个 bash 关键字为 blueshell,就退出:nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'
搜索、替换
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:sed 's/要被取代的字串/新的字串/g'
将 IP 前面 的部分予以删除:[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
将 IP 后面 的部分予以删除:[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
多点 编辑
一条 sed 命令,删除 /etc/passwd 第三行到末尾的数据,并把 bash 替换为 blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'-e 表示多点编辑
第一个编辑命令删除 /etc/passwd 第三行到末尾的数据
第二条命令搜索 bash 替换为 blueshell。
修改 文件内容
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
sed -i 's/\.$/\!/g' regular_express.txt
利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』
sed -i 's/\.$/\!/g' regular_express.txt
由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!
sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!
匹配行 的 下一行
如果 test 被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:sed '/test/{ n; s/aa/bb/; }' file
变形:y命令
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:sed '1,10y/abcde/ABCDE/' file