sed命令中的各种符号到底怎么用

大家使用linux命令的时候一定不要忘记一个命令文档 man这里面介绍的很详细。
sed命令很强大,基本上的文本重复性的劳动都可以交给它来处理。它支持正则表达式,多点编辑等。

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

我们有个文本文件里面内容如下,这个时候我需要将test开头的给他注释掉这个时候sed命令怎么写呢?

ubuntu@xxx:/tmp/sed$ cat test
test123
test234
hello
java
python
php
golang

执行完以下命令发现test开头的就被注释了

ubuntu@xxx:/tmp/sed$ sed -ri 's@(^test.*)@#\1@g' test
ubuntu@xxx:/tmp/sed$ cat test
#test123
#test234
hello
java
python
php
golang

那么我们来解析下这段命令sed-r标识regular expressions 正则表达式 -i标识编辑文件,参数-i和动作里面的i不是同一个意义别搞混了(^test.*)这段就是正则表达式代表test开头后面随便跟什么一个或者多个字符并进行分组。@符号标识sed命令的分割符,也可以使用# 或者/代替,看你写的语句如果包含不同符号的时候用另一种分割符号会规避与要操作的文本冲突避免转义的麻烦看着更简洁。最后的\1代表前面正则分组取值 s@@g s为替换命令g表示全局。
那么我们刚刚式在前面插入了#号那我如果需要在后面插入怎么处理呢?
接下来我们把#号先干掉然后在后面插入

ubuntu@xxx:/tmp/sed$ sed -ri 's@#@@g' test
ubuntu@xxx:/tmp/sed$ cat test
test123
test234
hello
java
python
php
golang

不好意思刚刚不小心把1、2两行替换成#了

ubuntu@xxx:/tmp/sed$ cat test
#
#
hello
java
python
php
golang

现在要把第一个行替换回test123,第二行替换回test234

#这里仅替换第一行
ubuntu@xxx:/tmp/sed$ sed -i '1s@#@test123@g' test
ubuntu@xxx:/tmp/sed$ cat test
test123
#
hello
java
python
php
golang
#这里可以用,隔开表示范围内遇到# 就替换成test234
ubuntu@xxx:/tmp/sed$ sed -i '1,3s@#@test234@g' test
ubuntu@xxx:/tmp/sed$ cat test
test123
test234
hello
java
python
php
golang
#在test之后添加 可以使用&符号&可以理解为当前查找到的值
ubuntu@xxx:/tmp/sed$ sed -ri 's@(^test)@&#@g' test
ubuntu@xxx:/tmp/sed$ cat test
test#123
test#234
hello
java
python
php
golang

如果用&代替上面正则分组可以写成这样

ubuntu@xxx:/tmp/sed$ sed -ri 's@(^test)@#&@g' test
ubuntu@xxx:/tmp/sed$ cat test
#test#123
#test#234
hello
java
python
php
golang

接下来上面两行已经利用完毕我们删除掉它可以使用以下命令d

ubuntu@yaozhongjie:/tmp/sed$ sed -ri '1,2d' test
ubuntu@yaozhongjie:/tmp/sed$ cat test
hello
java
python
php
golang

刚又不小心把文本变成这样了,怎么还原?

ubuntu@xxx:/tmp/sed$ cat test
@test123
hello
@test123
java
@test123
python
@test123
php
@test123
golang

没关系执行匹配删除就好了

ubuntu@yaozhongjie:/tmp/sed$ sed -i '/@test123/d' test
ubuntu@yaozhongjie:/tmp/sed$ cat test
hello
java
python
php
golang

是不是很强大?
接下来每行添加个空行

扫描二维码关注公众号,回复: 12773683 查看本文章
ubuntu@yaozhongjie:/tmp/sed$ sed -i 'G' test
ubuntu@yaozhongjie:/tmp/sed$ cat test
hello

java

python

php

golang

现在要如何消除空行呢?发现没有还是一样的删除所有$ 开头的在linux中$表示换行

ubuntu@yaozhongjie:/tmp/sed$ sed -i '/^$/d' test
ubuntu@yaozhongjie:/tmp/sed$ cat test
hello
java
python
php
golang

猜你喜欢

转载自blog.csdn.net/a807719447/article/details/112861051