Linux三剑客之sed命令详解

sed(Stream Editor)是Linux中的一种流编辑器,主要用于文本的过滤和转换。与大多数文本编辑器不同,sed用于非交互式的文本处理,常被用在批处理任务中。它可以对输入的文本流进行逐行处理,并根据脚本或命令对文本进行修改。

1. sed 的基本语法

sed [选项] 'script' [文件]
  • scriptsed脚本,由命令和模式组成,用来定义对文本进行的操作。
  • [文件]:需要处理的文本文件。如果不指定文件,sed会从标准输入读取文本。

2. 常用选项

  • -e:允许在一次调用中使用多个sed命令。
  • -i:直接编辑文件内容,而不是输出到标准输出(注意备份)。
  • -n:只打印处理过的行,而不是所有行。
  • -r:使用扩展正则表达式(ERE)。
  • -f:从文件中读取sed脚本。

3. sed 的基本命令

3.1 替换 (s)

s 命令用于替换文本,sed最常见的用法之一。

基本语法

sed 's/原文本/新文本/' 文件名

示例

echo "hello world" | sed 's/world/universe/'

输出:hello universe

全局替换
默认情况下,sed只替换每行中的第一个匹配项。要替换所有匹配项,需要使用全局标志 g

echo "apple apple apple" | sed 's/apple/orange/g'

输出:orange orange orange

替换指定出现次数的匹配
可以通过在 s/// 命令后添加数字来指定替换第几个匹配项:

echo "apple apple apple" | sed 's/apple/orange/2'

输出:apple orange apple

3.2 删除 (d)

d 命令用于删除行。

基本语法

sed 'N d' 文件名

这里的 N 表示行号。

示例
删除文件 file.txt 中的第2行:

sed '2d' file.txt

删除包含特定模式的行:

sed '/pattern/d' file.txt
3.3 插入 (i) 和追加 (a)

i 命令在指定行之前插入文本,a 命令在指定行之后追加文本。

基本语法

sed 'N i\插入的文本' 文件名
sed 'N a\追加的文本' 文件名

示例
在第2行之前插入一行:

sed '2i\This is an inserted line' file.txt

在第2行之后追加一行:

sed '2a\This is an appended line' file.txt
3.4 修改 (c)

c 命令用于用新文本替换指定的行。

基本语法

sed 'N c\新文本' 文件名

示例
New Line Content替换第2行:

sed '2c\New Line Content' file.txt
3.5 打印 (p)

p 命令用于打印匹配的行。配合 -n 选项使用时,只输出匹配行。

基本语法

sed -n '/pattern/p' 文件名

示例
只打印包含 hello 的行:

sed -n '/hello/p' file.txt
3.6 替换并保存修改 (-i)

使用 -i 选项可以直接在原文件上进行替换,而不需要将结果输出到新的文件。

示例
apple 替换为 orange,并将结果保存到原文件中:

sed -i 's/apple/orange/g' file.txt

4. sed 中的地址与范围

sed 可以指定行号或模式来定义命令的作用范围。

4.1 指定行号

对第3行进行替换:

sed '3s/apple/orange/' file.txt

对第1至3行进行替换:

sed '1,3s/apple/orange/' file.txt
4.2 使用模式匹配

对所有包含 pattern 的行进行替换:

sed '/pattern/s/apple/orange/' file.txt

对第1个pattern和第2个pattern之间的行进行操作:

sed '/pattern1/,/pattern2/s/apple/orange/' file.txt

5. sed 中的正则表达式

sed 支持正则表达式,可以用来进行复杂的模式匹配和替换。

示例

  1. 匹配以数字开头的行

    sed '/^[0-9]/d' file.txt
    

    删除所有以数字开头的行。

  2. 替换行尾的空白字符

    sed 's/[[:space:]]*$//' file.txt
    
  3. 替换第一个匹配的单词

    sed 's/\/replacement/' file.txt
    

6. sed 的其他高级用法

6.1 多命令执行

使用 -e 选项或通过分号分隔多个命令:

sed -e 's/apple/orange/' -e 's/banana/grape/' file.txt

或者:

sed 's/apple/orange/; s/banana/grape/' file.txt
6.2 从文件读取命令 (-f)

可以将一系列的 sed 命令保存在文件中,并使用 -f 选项执行这些命令:

sed -f commands.sed file.txt
6.3 结合其他命令

sed 可以结合其他命令如 grepawkcut 等,进行复杂的文本处理。

示例

grep 'pattern' file.txt | sed 's/old/new/'

总结

sed 是一个功能强大的文本处理工具,广泛用于日志处理、配置文件编辑和数据流修改等场景。通过 sed 的基本命令和模式匹配,可以高效地完成各种文本处理任务。

你可能感兴趣的:(linux,shell,bash,sed,运维,后端)