Linux之sed命令

和awk一样,本章主要通过实例对sed进行介绍。这样,更利于我们进行理解;所以,阅读本章时,请以“应用实例”为中心进行阅读,其它部分是参考内容。

sed介绍

sed是一个非交互性文本流编辑器。和awk一样,它是个独立的工具,当然也可以和bash联合使用。
它 可以随意编辑文件或标准输入,对它们进行编辑、删除。它能一次性处理所有改变,对用户来讲,十分高效。sed编辑文件或标准输入时,编辑的是它们的拷贝; 也就是说,不会改变原始的文件。若需要保存修改,可以通过重定向操作符>>、>>>,或者在利用sed的写入参数。

sed使用参数

[root@www ~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,
  则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令行模式上进行sed的动作编辑; -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r :sed 的动作支持的是扩展型正则表达式的语法。(默认是基础正则表达式语法) -i :直接修改读取的文件内容,而不是输出到终端。 动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在1020行之间进行的,则" 10,20[动作行为]" function有下面这些参数: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :替换, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何参数; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :替换,可以直接进行替换的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!

应用实例

首先建立一个123.txt,添加任意文本,然后进行以下练习。
(01), 输出文件第5行

$ sed -n '5p' 123.txt

说明:
-n表示默认不输出任何内容。5p表示输出第5行:5表示第5行,p表示输出。

(02), 输出文件除1-3行之外的行

$ sed -n '1,3!p' 123.txt

说明:
"1,3"表示输出范围是第1-3行; "1,3!"表示输出范围是除第1-3行之外。
'1,$p'表示输出全部行,因为$表示最后一行。

(03), 输出"ls -l"结果中的第1-3行

$ ls -l |sed -n '1,3p'

说明:
|是管道符号,表示将ls -l的输出作为sed的输入。

(04), 输出匹配“the”的行

$ sed -n '/the/p' 123.txt

说明:
/the/表示匹配the的行

(05), 输出匹配“the”的行,并且输出每行行号

$ sed -n -e '/the/p' -e '/the/=' 123.txt

说明:
-e表示对每行进行多重编辑,多重编辑的每一个命令前都需要添加-e。
本例中,-e '/the/p'打印匹配the的行;-e '/the/='表示输出匹配the的行的行号。

(06), 删除匹配“the”的行

$ sed '/the/d' 123.txt

说明:
d表示删除。

(07), 删除匹配“the”的行;然后输出删除操作之后的所有行,并输出每行行号

$ sed '/the/d' 123.txt | sed -n -e '1,$p' -e '1,$='

说明:
sed '/the/d' 123.txt :得到了删除“the”之后的行
| :管道符号。意味着前面的输出作为后面的输入
sed -n -e '1,$p' -e '1,$=' :表示输出全部行之后,在输出每行行号

(08), 在每一行前面插入2行文本,第一行是line1,第2行是line2

$ sed '1,$iline1\nline2' 123.txt

说明:
1,$i表示第一行到最后一行的每一行都执行插入操作。
line1\nline2表示插入的文本,其中\n转义之后表示“换行”符号。

(09), 在最后一行后面插入1行文本,内容是end

$ sed '$aend' 123.txt

说明:
$表示最后一行,a表示在文本后插入,end是插入的内容

(10), 将“this”全部替换成“that”

$ sed 's/this/that/g' 123.txt

说明:
[ address[,address ] ] s / pattern-to-find / replacement-pattern/[gpwn]
s 表示替换操作。查询pattern-to-find,成功后用replacement-pattern替换它。
替换选项如下:
g 缺省情况下只替换每行的第一次匹配,g表示替换每行的所有匹配。
p 缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。-n选项不打印输出结果。
w 后接“文件名”,表示将输出定向到一个文件。

(11), 将“this”全部替换成“this boy”

$ sed 's/this/this boy/g' 123.txt 或 $ sed 's/this/boy &/g' 123.txt

说明:
sed 's/this/boy &/pg' 123.txt中&表示附加修改(即在原始内容的基础上添加内容)。
&表示匹配的内容。即,boy &等价于boy this

(12), 去掉空白行后另存文件

$ sed '/^$/d' 123.txt > 456.txt 或 $ sed '/^$/c\' 123.txt > 456.txt

说明:
/^$/表示空白行:^表示开启,$表示结尾,开始和结尾之间没有任何内容,即是空白行。
c\表示修改。

(13), 去掉文件扩展名

$ echo "hello.txt"| sed 's/.txt//g'

(14), 添加文件扩展名

$ echo "hello"| sed 's/$/.txt/g'

(15), 删除文本中每一行的第2个字符

$ sed 's/.//2' ori.txt > dst.txt

(16), 删除文本中每一行的倒数第2个字符

$ sed 's/\(.\)\(.\)$/\2/' ori.txt > dst.txt

#说明:考察了sed中"\( \)"的含义和用法

(17), 删除每一行的第2个单词

$ sed 's/\([[:alpha:]]\+\)\(\ \)\([[:alpha:]]\+\)*/\1/' ori.txt > dst.txt

(18), 隔行删除

$ sed '0~2 d' ori.txt > dst.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值