linux:sed 用法详解

发布时间:2023年12月22日


1. 描述

sed 的全称是 “stream editor” (数据流编辑器),是以数据流的方式对文本内容进行编辑的。它主要用于对文本数据进行处理和转换,常被用于自动编辑一个或多个文件,简化对文件的反复操作,以及编写转换程序等。

此命令执行数据的顺序如下:

  1. 一次处理一行内容,默认不会直接修改源文件数据,处理时把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)。
  2. 接着用sed命令处理缓冲区中的内容,处理完成后把缓冲区的内容送往屏幕输出。

当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。

2. 语法

sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

2.1 参数

  -n, --quiet, --silent
                 取消自动打印模式空间
  -e 脚本, --expression=脚本
                 添加“脚本”到程序的运行列表
  -f 脚本文件, --file=脚本文件
                 添加“脚本文件”到程序的运行列表
  --follow-symlinks
                 直接修改文件时跟随软链接
  -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if SUFFIX supplied)
  -c, --copy
                 use copy instead of rename when shuffling files in -i mode
  -b, --binary
                 does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (
                 open files in binary mode (CR+LFs are not treated specially))
  -l N, --line-length=N
                 指定“l”命令的换行期望长度
  --posix
                 关闭所有 GNU 扩展
  -E, -r, --regexp-extended
                 use extended regular expressions in the script
                 (for portability use POSIX -E).
  -s, --separate
                 consider files as separate rather than as a single,
                 continuous long stream.
      --sandbox
                 operate in sandbox mode (disable e/r/w commands).
  -u, --unbuffered
                 从输入文件读取最少的数据,更频繁的刷新输出
  -z, --null-data
                 使用 NUL 字符分隔各行
  --help
                 display this help and exit
  --version
                 output version information and exit

sed元字符集

^ 匹配行开始,如:/^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结尾的单词的行;

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的行;

2.2 例子

替换

s/pattern/replacement/flags
flags功能
n1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file将缓冲区中的内容写到指定的 file 文件中;
&用正则表达式匹配的内容进行替换;
\n匹配第 n 个子串,该子串之前在 pattern 中用 () 指定。
\转义(转义替换部分包含:&、\ 等)。

替换文本中的字符串:

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 标记会替换每一行中的所有匹配:

 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中作为定界符使用,也可以使用任意的定界符

sed 's:test:TEXT:g' 
sed 's|test|TEXT|g' 

定界符出现在样式内部时,需要进行转义:

sed 's/\/bin/\/usr\/local\/bin/g'

删除

删除操作:d命令

删除空白行:

sed '/^$/d' file

删除文件的第2行:

sed '2d' file

删除文件的第2行到末尾所有行:

sed '2,$d' file

删除文件最后一行:

sed '$d' file

删除文件中所有开头是test的行:

sed '/^test/'d file

写入

写入文件:w命令

在example中所有包含test的行都被写入file里:

 sed -n '/test/w file' example

追加(行下):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 

插入(行上):

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

3. 参考

https://www.cnblogs.com/xiaoxie2014/p/12911241.html

http://c.biancheng.net/view/4028.html

https://www.linuxprobe.com/linux-sed-command.html

文章来源:https://blog.csdn.net/qq_36803941/article/details/135154637
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。