sed用法简介

本文简要介绍了Linux中的sed命令,包括正则表达式的使用,如字符匹配、匹配次数、位置锚定和分组引用。sed作为一个非交互式编辑器,常用于文本处理,文章中展示了其基本用法及一些高级命令的应用,如如何用sed将换行符替换为空格。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式

(1)字符匹配

    .   :匹配任意单个字符
    []  :匹配指定范围内的任意单个字符
    [^] :匹配指定范围外的单个字符字符

(2)匹配次数

    \?  :匹配前面字符0|1次
    .*  :匹配任意长度任意字符
    +   :匹配前面字符1|多次
    *   :匹配前面字符任意次
    {m,}:匹配前面字符至少m次
    {m,n}:匹配前面字符 m-n 次

(3)位置锚定

    ^   :行首锚定
    $   :行尾锚定
    ^$  :匹配空行
    ^pattern$:用pattern来匹配整行
    ^[[:space:]]*$:空行或包含空白字符的行
    ^[[:space:]]. :匹配以空格开头但不为空行的行
    \<root\>    :词首词尾锚定:匹配单词root,而不是*root,root*,*

(4)分组引用

	\(n\):分组
	\n   :引用第n个分组

sed

非交互式编辑器

sed [option] ... 'script command'  file
    option:
        -n :不输出模式空间 中的内容至屏幕
        -e :多点编辑
        -r :支持扩展正则
        -f file :以file中指定的条件匹配
        -i :修改源文件
        ~  :步长  # 2~2:从第2行开始且步长为2
        s  :替换
            不加参数,只替换每行匹配到的第一个
            g :全局替换
            p :显示替换成功的行
            i :不区分大小写
            w file :将结果写入到file中
            e :拼接
            c :修改整行
    script:
        n,m :匹配n~m行
        n,+m:匹配第n行及其后m行
        1,/root/
        /root/,1
        /root/,/shutdown/
    command:
        d :删除
        p :打印模式空间
        i :行前加入指定内容
        a :行后加入指定内容
        c :覆盖整行
        = :输出行号
        !:取反
        w file :写入文件file
        r file :从file中读取

示例

    [root@test1 test]# cat datafile
    northwest NW Charles Main      3.0 .98 3 34 
    western  WE Sharon Gray      5.3 .97 5 23 
    southwest SW Lewis Dalsass      2.7 .8 2 18 
    southern SO Suan Chin      5.1  .95 4 15 
    southeast SE      Patricia Hemenway    4.0  .7  4  17 
    eastern  EA  TB Savage       4.4  .84  5  20 
    northeast  NE  AM Main Jr.       5.1  .94  3  13 
    north   NO  Margot Weber       4.5  .89 5   9 
    central  CT  Ann Stephens         5.7  .94   5  13
    1、只打印找到north的行
    [root@test1 test]# sed -n '/north/ p' datafile
    
    2、删除第三行,其余行输出到屏幕
    [root@test1 test]# sed '3 d ' datafile
    从第3行到最后一行都删除,将剩余部分输出到屏幕
    [root@test1 test]# sed '1,2 !d' datafile
    [root@test1 test]# sed '3,$ d' datafile
   
    3、找到datafile中的所有west并替换成north,将替换后的内容输出到屏幕。
    [root@test1 test]# sed -n 's/west/north/gp' datafile
    
    4、所有的Hemenway所在的位置都用Jones来取代,而且只有改变的行被打印
    [root@test1 test]# sed -n 's/Hemenway/Jones/gp' datafile
   
    5、打印在west和east之间的模式范围内所有行
    [root@test1 test]# sed  -n '/west/,/east/ p' datafile
    
    6、把指定的行north写入到一个文件newfile中
    [root@test1 test]# sed '/north/ w newfile' datafile
   
    7、在north行后添加“central  CT  Ann Stephens         5.7  .94   5  13”
    [root@test1 test]# sed  '/north/ a central CT Ann Stephens 5.7 .94 5 13' datafile

    
    1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
    [root@test1 Test]# sed 's/^ *//g' grub2.cfg
    
    2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
    [root@test1 Test]# cp /etc/fstab ./
   
    3、在/root/install.log每一行行首增加#号
    [root@test1 Test]# sed -r 's/^# +//g' fstab
    
    4、在/etc/fstab文件中不以#开头的行的行首增加#号
    [root@test1 Test]# sed -r  's/^[^#].*/#&/ ' fstab
    
    5、利用sed 取出ifconfig命令中本机的IPv4地址
    [root@test1 Test]# ifconfig >ifconfig
    [root@test1 Test]# sed -n  '2 p' ifconfig |sed -r 's/inet (.*) net.*/\1/'

sed高级命令

sed有两个内置的存储空间:在使用高级命令的时候会用到
模式空间:sed内置的一个缓冲区,用来存放,修改从输出文件中读取的内容

保持空间:sed内置的另一个缓冲区,用来存放临时的数据,sed可以 在保持空间和模式空间交换数据,但不能在保持空间执行普通sed命令。

sed 在每次循环读取数据是,模式空间会被清空,但保持空间的内容不变
    编辑命令:
        h :把模式空间中的内容覆盖至保持空间中
        H :把模式空间中的内容追加至保持空间中
        g :把保持空间中的内容覆盖至模式空间中
        G :把保持空间中的内容追加至模式空间中
        x :把模式空间中的内容与保持空间中的内容互换
        n :覆盖读取匹配到的行的下一行至模式空间中
        N :追加读取匹配到的行的下一行至模式空间中
        d :删除模式空间中的行
        D :删除多行模式空间中的所有行

示例

    1. 把test中的1-3行复制到文件末尾
        [root@test1 Test]# sed '1,3H;$G' test
    2. 把第二行复制到第四行
        [root@test1 Test]# sed '2H;4G' test
    注:上面两个示例中,用的H,故模式空间本来会有一个空行,所以添加的内容和源文件中会以空格分开,下面的用h,会覆盖原保持空间内容,故没有空格分开
    3. 把第行剪切到文件末尾
        [root@test1 Test]# sed '1h;$G' test
    4. 把1-2行剪切到文件末尾
        [root@test1 Test]# sed '1h;2H;$G' test

    5. 把/etc/passwd中能登录的用户及密码(/etc/shadow)提取出来写入user-passwd.txt文件中
        (1)先取出/etc/passwd中以bash结尾的行
            [root@test1 Test]# sed -n '/bash$/p' /etc/passwd
        (2)将上面取出的行截取出来用户名,写入user中
            [root@test1 Test]# sed -n '/bash$/p' /etc/passwd|sed -nr 's/(^[^:]*).*/\1/p'  >user
        (3)根据user文件中的用户名截取/etc/shadow中的密码串
            [root@test1 Test]# sed -nf user /etc/shadow
        (4)截取(3)取出行的密码串
            [root@test1 Test]# sed -nf user /etc/shadow | sed -nr 's/^([^:]*:)(.*)/\2/p'| sed -nr 's/^([^:]*).*/\1/p'

        注:这样虽然账号和密码都取出来了,但是没有写入文件中,写入文件会很麻烦,通过写shell脚本来实现
            [root@test1 Test]# vim user_passwd.sh
                1 #!/bin/bash
                2 sed -n '/bash$/ s/:.*//w user.txt' /etc/passwd
                3 > user-passwd.txt
                4 for user in `cat user.txt`
                5 do
                6 pass=`sed -n "/$user/ p" /etc/shadow | cut -d : -f 2`
                7 echo "用户名: $user   密码:$pass"  >> user-passwd.txt
                8 done
            [root@test1 Test]# sh user_passwd.sh    
            [root@test1 Test]# cat user-pass.txt

用sed将换行符改成空格

[root@nfs01 ~]# echo "a,b,c,d" |sed 's/,/\n/g' |sed ':label;N;s/\n/:/;t label'

------------------------------------------------------------------------------------------------------- 返回目录

<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、付费专栏及课程。

余额充值