Linux文本操作-sed

本文对比讲解了sed与awk在交互式与非交互式操作、文本编辑与行操作模式上的区别,详细介绍了它们在文本替换、统计和复杂模式匹配中的应用,包括全局替换、寻址和脚本文件的使用。

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

sed,awk

vim 全文本编辑器
sed,awk,行编辑器

vim,sed,awk的区别:

  • 交互式和非交互式(交互式:vim;非交互式:sed,awk)
  • 文本操作编辑模式与行操作模式(文本编辑:vim;行编辑:sed,awk)

sed一般用于对文本内容做替换

sed 's/user1/u1/' /etc/passwd

awk一般用于对文本内容进行统计,按需要的格式进行输出

cut -d : -f 1 /etc/passwd

awk -F:'/wd$/{print $1}' /etc/passwd

sed

sed的基本工作方式是:

  • 将文件以行为单位读到内存(模式空间)
  • 使用sed的每个脚本对该行进行操作
  • 处理完成后输出该行

有3行,sed有三个命令。先读取一行,执行三个命令,输出结果;读取第二行,执行命令,输出结果;。。。

sed的替换命令s:

sed 's/old/new/' filename   // s 替换 old  换成 new

sed -e 's/old/new/' -e 's/old/new/' filename ... //sed使用多个指令,可以使用-e选项

sed -i  's/old/new/' 's/old/new/' filename... // 替换完成后,把替换后的结果原样写会到文件里,使用-i

sed -r 's/扩展正则表达式/new' filename // -r 使用s命令替换的时候,能够使用扩展正则表达式(+,?,|)
echo a a a > afile
sed 's/a/aa/' afile
sed 's///abc/' afile  // 报错,使用下面这种方式,!做分隔符
sed 's!/!/abc!' afile
sed -e 's/a/aa/' -e 's/aa/bb/' afile 等价于下面这个
sed 's/a/aa/;s/aa/bb/' afile bfile

cat afile // 原文件没有变化,要改原文件,可以使用 -i

sed -i  's/a/aa/;s/aa/bb/' afile
sed 's/a/aa/;s/aa/bb/' afile > bfile
head -5 /etc/passwd

head -5 /etc/passwd | sed 's/...//'

head -5 /etc/passwd | sed 's/s*bin//'

grep root /etc/passwd | sed 's/^root//'

cat bfile
b
a
aa
aaa
ab
abb
abbb

sed 's/ab*/!/' bfile

sed -r 's/ab+/!/' bfile  // + 出现一次或多次

sed -r 's/ab?/!/' bfile // ? 出现0次或1次

sed -r '/s/a|b/!/' bfile // 匹配a或b

sed命令加强版

  • 全局替换
  • 标志位
  • 寻址
  • 分组
  • sed脚本文件

全局替换

s/old/new/g

g为全局替换,用于替换所有出现的次数

/ 如果和正则匹配的内容冲突可以使用其他符号,如:s@old@new@g
head -5 /etc/passwd | sed 's/root/!!!!/g'

head -5 /etc/passwd | sed 's/root/!!!!/2' //  只匹配到出现第二次,进行替换

head -5 /etc/passwd | sed 's/root/!!!!/w /tmp/a.txt' //把替换成功的行 ,写入到/tmp/a.txt

寻址
对文件处理的时候,是处理指定的范围。(比如只处理第五行到第十行,只处理包含root的行。。。)

寻址用法:

/正则表达式/s/old/new/g

行号s/old/new/g  // 行号可以是具体的行,也可以是最后一行$符号


head -6 /etc/passwd | sed 's/adm/!/'

head -6 /etc/passwd | sed '1s/adm/!/' // 只在第一行替换

head -6 /etc/passwd | sed '1,3s/adm/!/' // 第一行到第三行做替换

head -6 /etc/passwd | sed '1,$s/adm/!/' // 第一行到最后一行做替换

head -6 /etc/passwd | sed '/root/s/bash/!/' // 正则表达式,匹配root这一行

head -6 /etc/passwd | sed '/^bin/,$s/nologin/!/' // 以bin开头,到结尾进行替换

head -6 /etc/passwd | sed '/^bin/,$s/nologin/!/g' // 多次替换

脚本文件

可以将选项保存为文件,使用-f加载脚本文件

sed -f sedscript filename

sed的其他命令

  • 删除命令
  • 追加,插入,更改
  • 打印
  • 下一行
  • 读文件和写文件
  • 退出命令
删除命令
[寻址]d

删除模式空间内容(不会把脚本的原始文件删除掉),改变脚本的控制流,读取新的输入行(意味着d后边的其他指令是不会被执行的)
cat bfile
b
a
aa
aaa
ab
abb
abbb

sed '/ab/d' bfile

sed 'ab/d;s/a/!/' bfile // d后边的指令不会被执行

追加插入和更改

追击命令 a
插入命令 i
更改命令 c

cat bfile
b
a
aa
aaa
ab
abb
abbb

sed '/ab/i hello' bfile

sed 'ab/c hello' bfile // 把匹配到ab的行,变成hello

sed 'ab/r afile' bfile // 匹配ab后,读取afile的内容,写入到后面

sed 'ab/r afile' bfile > cfile // 经常用r的方式进行多文件的合并

读文件和写文件

  • 读文件命令r
  • 写文件命令w

下一行

  • 下一行命令 n
  • 打印行号命令 =

打印

  • 打印命令p
sed '/ab/p' bfile

退出命令

  • 退出命令q
  • 哪个效率会更高呢
    • sed 10q filename
    • sed -n 1,10p filename
seq 1 10

seq 1 1000000 > lines.txt
wc -l lines.txt
sed -n '1,10p' lines.txt  // 打印前10行
time sed -n '1,10p' lines.txt  // 统计运行时间

time sed -n '10q' lines.txt

sed的多行模式

  • 为什么有多行模式
  • 多行模式处理命令N,D,P

为什么要有多行模式

  • 配置文件一般为单行出现(主要为了应对配置文件多行的场景)
  • 也有使用XML或JSON格式的配置文件,为多行出现。
    多行匹配命令
  • N 将下一行加入到模式空间
  • D 删除模式空间中的第一个字符到第一个换行符
  • P 打印模式空间中的第一个字符到第一个换行符
vim a.txt
hel
lo

sed 'N' a.txt

sed 'N;s/hel\nlo/!!!/' a.txt // 将下一行加入到模式空间

sed 'N;s/hel.lo/!!!/' a.txt
[root@server ~]# cat >  b.txt << EOF
> hell
> o bash hel
> lo bash
> EOF

cat b.txt   // 想要 hello bash 
            //hello bash

sed 'N;s/\n//;s/hello bash/hello sed\n/;P;D' b.txt  // 配置文件两行一组

sed 'N;N;s\n//' // 配置文件三行一组

sed的保持空间

  • 什么是保持空间
  • 保持空间命令

什么是保持空间

  • 保持空间也是多行的一种操作方式
  • 将内容暂存在保持空间,便于做多行处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJ9Xgqvo-1634781388826)(https://note.youdao.com/yws/res/14598/2CE08818B6E54BA3A1EC5306E45CA96D)]

保持空间命令

  • h和H将模式空间内容存放到保持空间 // h 覆盖模式 H 追加模式
  • g和G将保持空间内容取出到模式空间 // g 覆盖模式 G 追加模式
  • x交换模式空间和保持空间内容

保持空间只能进行临时数据的存储,不能操作。

head -6 /etc/passwd | cat -n | tac  // tac 倒序输出

cat -n /etc/passwd | head -6 | sed -n '1h;G;x;$p'

cat -n /etc/passwd | head -6 | sed -n '1h;1!G;x;$p'

cat -n /etc/passwd | head -6 | sed -n '1h;1!G;$!x;$p'


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值