Linux命令行与shell脚本编程大全笔记(sed基础)

一. sed编辑器介绍
sed编辑器被称为流编辑器,sed编辑器根据命令来处理数据流中的数据,命令要么从命令行输入,要么存于文本中。

  1. 一次读取一行数据
  2. 根据编辑器命令匹配数据
  3. 按照命令修改流中的数据
  4. 新的数据输出到STDOUT

二、sed 命令选项

-e将指定的命令添加到已有的命令中
-f将file中指定的命令添加到已有的命令中
-n不产生命令输出,用print命令完成输出

三、 常用命令示例
*sed编辑器不会修改文本文件的数据,只会将修改后的数据发送到STDOUT

  1. echo "this is a test" | sed 's/test/big test/'
    解释: s – 替换命令

  2. sed -e 's/a/b/; s/c/d/' file.txt
    解释: -e – 执行多个命令,命令之间用分号隔开,命令末尾和分号之间不可有空格

  3. sed -f script1.sed file.txt
    解释:-f – 从文本中读取命令,文本中每行格式(s/a/b/)

  4. 更多的替换选项
    默认情况下s只替换每行出现的第一处,替换标记可以解决

数字表明新文本将替换第几处模式匹配的地方
g替换所有匹配的文本
p表明原先行的内容要打印出来
w将替换结果写入到文件中
sed 's/test/xxxx/2'  data.txt # 替换每行第二次模式匹配的地方
sed 's/a/b/g'   data.txt
sed  -n 's/a/b/p' data.txt   (只输出被替换命令的修改行)

特殊处理

sed  's/\/bin\/bash/\/bin\/ksh/'   /etc/passwd # 转义字符
or(! 替换sed的分隔符)
sed  's!/bin/bash!/bin/ksh!'   /etc/passwd
  1. 数字方式的行寻址
sed '2s/a/b/' data.txt
sed '2,3s/a/b/' data.txt
sed '2,$s/a/b/' data.txt # 从第二行开始到最后一行的所有行
  1. 使用文本模式过滤器
sed '/findtxt/s/a/b/' data.txt (一般使用正则表达式)
  1. 命令组合-{}
sed  '2{s/a/b/; s/c/d/}' data.txt   (单行多条命令) # 类似 -e 命令
sed  '3,${s/a/b/; s/c/d/}' data.txt
  1. 删除行
    使用命令时要特别小心,如果未加寻址模式,则流中的所有文本行都会被删除。
sed 'd' data1.txt  (删除data1中的内容)
sed '3d' data1.txt (仅删除第三行)
sed '2,3d' data1.txt (删除2,3行内容)
sed '2,$d' data1.txt (删除第二行到末尾的行)
sed '/number1/d' data1.txt (删除匹配number1行的内容)
/*使用两个文本模式删除行要特别小心,第一个模式打开删除功能,第二个模式关闭删除功能,但是因为只要匹配了第一个模式,删除功能就会打开,若没匹配到第二个模式则会一直删*/
sed '/1/,/3/d' data1.txt
  1. 插入和附加文本
    i – 在指定的行前增加一个新行
    a – 在指定的行后增加一个新行
echo "test line 2" | sed 'i\test line 1'  (注意是反斜杠)
echo "test line 2" | sed 'a\test line 1'
//增加寻址
sed '3i\this is an inserted line.'  data1.txt
sed '3a\this is an appended line.'  data1.txt
sed '$a\this is a new line of text' data1.txt
sed '1i\line 1\nline 2\n line 3' data1.txt (插入多行使用\n)
  1. 修改行
    c – 命令允许修改数据流中整行文本行的内容
sed '3c\this is a changed line of test.'  data1.txt
sed  '/number 3/c\this is a changed line of text.' data1.txt (匹配模式会匹配所有符合条件的行)
sed '2,3c\this is a new line.' data1.txt (将两行修改为1行)
  1. 转换命令
    唯一可以处理单个字符的sed编辑器命令,且命令为全局命令,无法限定只转换特定地方出现的字符
sed 'y/123/456/' data1.txt (将123一一映射为456并进行替换)
echo "this  1 is a test of 1 try." | sed 'y/12/34/'
:this 2 is a test of 2 try.
  1. 回顾打印
p打印文本行
=打印行号
l(小写L)列出行

打印行

echo "test line" | sed 'p'
:test line
:test line

sed '/number 3/p' data1.txt
:this is line number 3

sed -n '2,3p' data1.txt
:this is line number 2
:this is line number 3

sed -n '/3/{p; s/line/test/p}' data1.txt
:this is line number 3
:this is test number 3 

打印行号

sed '=' data1.txt
:1
:this is line number 1
:2
:this is line number 2

sed -n '/number 4/{=; p}' data1.txt
:4
:this is line number 4

列出行
可以打印数据流中的文本和不可打印的ASCII字符

cat data1.txt
:this     line     contains    tabs.

sed -n 'l' data1.txt
this\tline\tcontains\ttabs.$

13.用sed处理文件
写入文件

sed '1,2w  infile.txt'  data1.txt
cat infile.txt
:this is line number 1
:this is line number 2

sed -n '/number1/w infile.txt'  data1.txt (sed只会将包含文本格式的数据行写入文件)
cat infile.txt
:this is line number1

从文件读取数据

cat  file.txt
:aaa
:bbb
sed '1r file.txt' data1.txt (将file.txt中的内容插入到第一行后)
:this is line number 1
:aaa
:bbb
sed '/number 2/r fil.txt' data1.txt
sed '$r file.txt' data1.txt

使用占位符

sed '/LIST/{r file.txt; d}'  notice.std (占位文本已经替换为数据文件中的名单)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值