- 创建测试文本
首先vim test.txt
创建一个测试语句,其中输入文本:
this is a test
1line
2line
使用wq!
保存并退出。
使用cat -A test.txt
查看测试文件内容:
cat -A
呢不仅可以查看完文本,还能查看文本中隐藏的分隔符等信息,比如上图中每一行结尾的$
代表着结尾换行符。
- sed的使用结构
sed [-nefri] [处理] 待处理的文件
1.选项[-nefri]中的-n
sed命令在对文本进行处理后,会默认把处理过的所有文本标准输出到屏幕上,使用
-n
命令则可以只输出文本中被处理过的行。
[处理]
通常使用两个单引号包裹双下划线'/正则等处理/'
来使用,是通常哈,有时候也没有双下划线,但两个单引号必有。
1.sed -n '/带匹配字符/p' 待处理的文件
输入命令sed '/line/p' test.txt
。
这里先解释一下,sed
的处理是包裹在两个单引号和下划线之间的,这里的'/line/p'
代表匹配包含字母line
的行,p
则代表输出print
,连起来的意思就是匹配待处理文件中包含字母line
的行并打印该行:
那么为什么除了打印匹配到line
的行以外还把原始的所有内容给打印了呢?这是因为sed
默认将处理过的原始文本也输出到屏幕上,这里没对原始文本进行增删改
,只是查
,因此原始文本也原封不动地输出。
那么加上-n
就能仅输出被处理的内容:
输入命令sed -n '/line/p' test.txt
。
2.选项[-nefri]中的-e
-e
代表直接在命令模式上进行sed的操作编辑,主要作用是可以在一行执行多个处理操作。
对以下命令进行解析:
sed -e '1,2p' -e '1,2athis is a new line' test.txt
首先看sed -e '1,2p' test.txt
是什么意思哈:
它是实现了打印第一行和第2行的操作,当然由于没有使用
-n
,原始文本也被打印了出来,那么加上-n
试试:说明第一节讲得没错哈。接下来看
sed -e '1,2athis is a new line' test.txt
:它是在第一行和第二行之间插入了新的一行
this is a new line
,那么盲猜1,2athis is a new line
中1,2
后的那个a
是代表插入新内容吧(不记得了)。所以连起来
sed -e '1,2p' -e '1,2athis is a new line' test.txt
则是执行了两种操作:3.选项[-nefri]中的-f
-f
直接将sed的操作写在一个文件夹内。
4.选项[-nefri]中的-r
-r
代表使用扩展正则表达式的语法。
正则表达式前面有讲过正则匹配-JS正则表达式的使用-method01 - 简书 (jianshu.com)
这里简单提一下:
+
一个或者多个
?
0个或者一个
|
或(or)
的方法找出整个字符串
()
捕获
()+
捕获的重复
sed 's/\([0-9]\) \([a-z]\)/\1\t\2/g' test.txt #在数字与字母间插入tab
sed -r 's/([0-9]) ([a-z])/\1\t\2/g' test.txt #使用扩展正则,捕获的()不用\转义
5.选项[-nefri]中的-i
-i
直接修改读取的文件内容,而不是由屏幕输出。
[处理]
说明
'[n1,{n2}] function'
#sed 执行的处理需要放在单引号之中,
n1,n2
不一定会存在,代表被处理的行数。
function包括:
a
新增,a
的后面接新增的字符,这些字符会出现在目前行的下一行。
新增多行内容
sed '1,2athis is a new line' test.txt #在第1/2行之后新加一行内容
this is a test
this is a new line
1line
this is a new line
2line
$sed '1,2athis is a new line\
>this is another new line' test.txt #新加多行内容:反斜杠回车后继续写
this is a test
this is a new line
this is another new line
1line
this is a new line
this is another new line
2line
除此以外:
c
替换,c
的后面接字符,这些字符会替换n1,n2行之间的内容。
d
删除。
i
插入,i
后面接字符,这些字符会插入到当前行的上一行。
p
打印。
s
替换。