已复制
全屏展示
复制代码

linux最常用命令sed详解


· 3 min read

一. 命令概述

sed是一种流编辑器。它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,也称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾,文件内容并不会改变。

二. 命令格式

sed [option] 'command' inputFile

三. 常用选项

  • -n 使用安静模式。在一般sed的用法中,所有的内容一般都会被列出到屏幕上。-n参数使得只有经过sed特殊处理的那一行才会被列出来。
  • -e 进行多项编辑,即对输入行按照sed命令出现顺序依次应用。比如sed -e '/group/s/if/ifif/g' -e '/group/s/else/elseelse/g' test.txt表示将匹配group的行中if替换成ifif,else替换成elseelse。
  • -f 直接将 sed 的动作写在一个文件内,-f filename 则可以执行filename内的sed命令。
  • -r 使得sed命令支持扩展的正则表达式(默认是基础正则表达式)。
  • -i 直接修改读取的文件内容,而不是由屏幕输出。

四. 常用命令

a\ 后面插入行

  • sed '1,$a\add one' test.txt 在第一行到最后一行的每一行下面追加"add one"字符串行。多行字符串可以用\n分隔
  • sed '/first/a\add one' test.txt 在匹配到first行下面追加"add one"字符串行。

i\ 前面插入行

  • sed '1,$i\add one' test.txt 在第一行到最后一行的每一行前面追加"add one"字符串行。

c\ 替换指定行

  • sed '1,4c\add one' test.txt 将第一行到第4行替换成"add one"字符串行。

s 替换指定字符

  • sed 's/line/text/g' test.txt 将所有行的line替换为text,g代表全局选项,没有g只替换所有行的第一个匹配项。
  • sed '/^first.*end$/s/line/text/g' test.txt 匹配以first开头end结尾的所有行,然后将line全部替换为text
  • sed 's/\(.*\)line$/\1/g' test.txt 括号\(\)中包裹的内容表示正则表达式的第1个分组,\1表示前面匹配到的第一个分组,相当于删除所有行行末的line
  • sed 's/re\.\w+/search/g' test.txt 将所有行的能匹配正则re\.\w+的部分替换成search

d 删除指定行

  • sed '1,4d' test.txt 删除第一行到第四行
  • sed '/first/d' test.txt 删除匹配到first的行
  • sed -r '/function/,/return ret/d' test.txt 删除functionreturn ret的行,即删除函数function。

p 打印指定行

  • sed -n '/^first.*end$/p' test.txt 以first开头end结尾的所有行全部打印

r 读取文件

  • sed '/baseurl/r template.txt' redis.conf 将指定文件读取到匹配行后面。

w 写入文件

  • sed '/baseurl/r template.txt' redis.conf 将匹配到的行写入template.txt文件。

n 移到下一行执行下一个命令

  • sed '/test/{ n; s/aa/bb/; }' test.txt 如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb。
  • sed -n 'p;n' test.txt 打印基数行
  • sed -n 'n;p' test.txt 打印偶数行

五. 使用环境变量

  • sed '$a\'"$hostname"'' /etc/ansible/hosts 在最后一行添加环境变量hostname,环境变量需要用双引号,环境变量的前后还需要一个单引号。
🔗

文章推荐