sed用法小记

SED是什么?

sed:Stream EDitor 流编辑器

SED是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大。——–百度百科

sed命令与grep、awk并称linux字符处理三剑客。
它主要是对行的内容进行处理,对指定字符数据按照指定的脚本规则进行处理并输出。


命令使用格式:
sed [option] 'script' inputfile

常用选项表

命令选项用途
-n:不输出模式空间内容到屏幕,即不自动打印
-e:多点编辑
-f: /PATH/SCRIPT_FILE:从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i.bak:备份文件并原处编辑

SCRIPT脚本

功能模块功能描述
地址定界(1) 不给地址:对全文进行处理
(2) 单地址:#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行
编辑命令:d: 删除模式空间匹配的行
p: 显示模式空间中的内容
a [\]text:在指定行后面追加文本
支持使用\n实现多行追加
i [\]text:在行前面插入文本
c [\]text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///s///:查找替换,支持使用其它分隔符, s@@@, s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

示例

sed ‘2p’ /etc/passwd 打印第二行两次
sed –n ‘2p’ /etc/passwd 只打印第二行
sed –n ‘1,4p’ /etc/passwd 打印1 4行
sed –n ‘/root/p’ /etc/passwd 带root行打印
sed –n ‘2,/root/p’ /etc/passwd 从2行开始
sed -n ‘/^$/=’ file 显示空行行号
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file 显示空行并打印行号
sed ‘/root/a\superman’ /etc/passwd 行后
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行
sed ‘/^$/d’ file 删除空白行
sed ‘1,10d’ file 删除1,10行
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’第二行后增加文本tea
sed ‘s/test/mytest/g’ example 文本中字符串test替换成mytest
sed –n ‘s/root/&superman/p’ /etc/passwd 单词后
sed –n ‘s/root/superman&/p’ /etc/passwd 单词前
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets pets文件中,dog替换成cat,hi替换成lo
sed –i.bak ‘s/dog/cat/g’ pets 把原文件创建备份后替换

高级用法

语法描述
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d:删除模式空间中的行
D:删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

高级用法解释:

这里写图片描述

sed有模式空间和保持空间,普通模式使用模式空间处理,高级模式在模式空间和保持空间协作处理。

高级语法示例:

sed -n ‘n;p’ FILE 显示偶数行
sed ‘1!G;h;$!d’ FILE 倒序显示
sed -n ‘1!G;h;$p’ 倒序显示
seq 7 |sed ‘n;d’ 显示奇数
sed ‘N;D’ 显示最后一行
sed ‘$!d’ 显示最后一行
sed ‘G’ 每行之间加空行
sed ‘g’ 把每行内容替换成空行
sed ‘/^$/d;G’ 确保每一行下面都有一个空行

实例操作

1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头
的行行首的空白字符

cat grub2.cfg |sed -r 's/^[[:space:]]+//'

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空
白字符的行的行首的#和空白字符

sed -r "/^#[[:space:]]/s/^#[[:space:]]+([^[:space:]])/\1/" fstab
sed -r 's/^#[[:space:]]+//' fstab

3、在centos6系统/root/install.log每一行行首增加#号

sed 's/^/#/g' /root/install.log

4、在/etc/fstab文件中不以#开头的行的行首增加#号

cat /etc/fstab |sed  's/^[^#]/#&/'

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名

echo /etc/sysconfig/network-scripts/ |sed -r  's#(^/.*/)([^/].*/?$)#a:\1\nb:\2#'

6、利用sed 取出ifconfig命令中本机的IPv4地址

ifconfig eth0 |sed -n '2p' |sed 's#^.*addr:##g' |sed 's#  Bcas.*$##g'
ifconfig eth0 |sed  -n -e  '2s#^.*addr:##g' -e 's#  Bcas.*$##gp'

7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

ls /media/Packages/*.rpm|sed -r -e 's/\.rpm$//g' -e 's/.*\.\<//g'|sort -nr|uniq -c  

8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)

egrep -o "[[:alpha:]]+" /etc/init.d/functions|sort -nr |uniq -c
sed -r -e "s/([[:alpha:]]+)/\n\1\n/g" -e 's/[^[[:alpha:]]\n]*//g' /etc/init.d/functions  (半成品)

9、将文本文件的n和n+1行合并为一行,n为奇数行

seq 10|sed 'N;s/\n//g'

总结

有关两个空间的高级用法,需要大家去自习揣摩,慢慢分析。相信你们可以完全掌握它~

<think>好的,用户现在想了解sed命令的用法,尤其是如何应用在之前提到的脚本功能中,比如提取行内容、排序等。首先,我需要回顾用户之前的对话,确保回答的连贯性。用户之前询问的是在Linux中编写脚本,提取特定行并处理,现在他们想深入理解sed的具体用法,可能想优化之前的脚本或扩展功能。 首先,用户提到参考了之前的引用内容,特别是关于sed的部分。之前的回答中,我提到了使用sed提取行号范围,比如sed -n '5,15p' input.txt。用户现在可能想更详细地了解sed的各种用法,以便更灵活地处理文件。 我需要先确定用户的需求点。用户可能需要基础的sed语法,常用选项,以及如何结合实例来提取行内容,可能还涉及到排序。但需要注意的是,sed本身并不具备排序功能,排序通常用sort命令,但用户可能在脚本中结合使用sed和sort,因此需要说明如何将两者结合。 接下来,用户的问题包括示例、提取行内容、排序和Linux环境。所以,回答的结构应该包括sed的基本语法、常用选项、提取行的示例(包括单行、范围、模式匹配、组合条件等),然后说明如何与sort结合使用。此外,用户可能对替换、删除、插入等操作感兴趣,但根据之前的问题,重点可能在提取和转换,所以需要强调这些部分。 另外,用户之前的脚本中使用了临时文件,可能想了解如何通过管道和sed优化脚本,避免临时文件。比如,使用管道将sed处理后的结果直接传给sort,而无需中间文件。因此,在示例中需要展示这种用法,比如sed -n '5,8p' input.txt | sort -u,这样用户可以看到如何将两者结合,提升脚本效率。 还要注意用户提到的“第三行相同的内容”,之前的脚本可能处理的是第三行的内容,但用户现在的问题更侧重于sed命令本身。需要确保示例覆盖用户可能用到的场景,比如提取特定行、根据模式匹配处理等,并结合之前的脚本需求,比如提取第三行内容来命名文件。 最后,用户可能需要错误处理的示例,比如当sed无法找到匹配行时如何处理,或者如何验证输入文件的存在,这在之前的脚本中也有涉及。但根据当前问题,可能更侧重命令本身的用法,但可以简要提到在脚本中加入错误检查的重要性。 总结回答结构:先介绍sed的基本用法和选项,然后详细说明提取行内容的多种方法(行号、模式、正则表达式),给出实际示例,接着展示如何与sort结合使用,最后给出综合应用实例,可能结合用户之前的脚本需求,比如提取特定行、处理并排序,输出最终文件。同时,相关问题需要引导用户深入,比如处理多条件、使用正则表达式优化匹配等。</think>### Sed命令深度解析(基于历史脚本需求优化) ——以下操作适配Linux/macOS环境—— ### 一、Sed核心操作模式 $$sed [选项] '地址范围/操作命令' 文件$$ - **地址范围**:决定操作作用的行(单行`3`,范围`5,8`,模式`/ERROR/`) - **操作命令**:执行的具体动作(`p`打印,`d`删除,`s`替换) ### 二、关键参数对照表 | 参数 | 功能说明 | 应用场景 | |------|-------------------------|----------------------------| | `-n` | 取消默认输出 | 配合`p`命令精确提取内容[^1] | | `-i` | 直接修改源文件 | 日志文件实时处理 | | `-e` | 执行多条命令 | `sed -e '1d' -e 's/old/new/'` | | `-r` | 启用扩展正则 | 匹配复杂模式(如IP地址) | ### 三、内容提取实战(基于历史脚本需求) #### 1. 行号定位提取 ```bash # 提取第3行内容(原脚本的第三行匹配需求) sed -n '3p' input.txt > third_line_content.txt # 提取5-8行并去重排序(原脚本最终输出需求) sed -n '5,8p' input.txt | sort -u > final_output.txt ``` #### 2. 模式匹配提取 ```bash # 提取包含特定标识的行(原脚本的临时文件生成需求) sed -n '/^[A-Za-z0-9]\{6\}$/p' input.txt # 匹配6位英文数字组合 # 多条件组合提取(ERROR日志+时间戳) sed -n '/ERROR/{/2023-08/p}' server.log ``` #### 3. 动态内容处理 ```bash # 提取第三行内容作为文件名(原脚本的临时文件命名需求) filename=$(sed -n '3p' input.txt | tr -cd '[:alnum:]').tmp sed -n '5,8p' input.txt > $filename ``` ### 四、高级应用模式 #### 1. 正则替换与提取 ```bash # 提取带版本号的行并格式化输出 sed -nr 's/.*(v[0-9]+\.[0-9]+).*/\1/p' versions.txt ``` *输入*:`Release version v2.18.9` → *输出*:`v2.18.9` #### 2. 范围操作组合 ```bash # 删除注释行后提取有效内容 sed '/^#/d; /^$/d' config.cfg > clean_config.cfg ``` #### 3. 动态脚本集成(原脚本增强) ```bash #!/bin/bash # 提取第三列数值>100的记录 sed -n '/^[^#]/ { # 跳过注释行 s/[[:space:]]+/ /g # 标准化空格 p }' data.log | awk '$3 > 100' ``` ### 五、典型错误排查 1. **模式不匹配**: ```bash # 检查正则表达式有效性 echo "test" | sed -n '/[A-Z]/p' # 应无输出(区分大小写) ``` 2. **文件权限问题**: ```bash sed -i 's/old/new/' protected_file # 需要sudo权限 ``` 3. **特殊字符处理**: ```bash sed 's/\//\\\//g' # 转义路径中的斜杠 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值