shell命令sed用法

1.sed介绍

Linux世界中最广泛使用的 两个命令行编辑器:sed和awk

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储 在一个命令文本文件中。sed编辑器会执行下列操作。

(1) 一次从输入中读取一行数据。
(2) 根据所提供的编辑器命令匹配数据。
(3) 按照命令修改流中的数据。
(4) 将新的数据输出到STDOUT。 在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
由于命令是按顺序逐行给出的,sed编辑器只需对数据流进行一遍处理就可以完成编辑操作。
这使得sed编辑器要比交互式编辑器快得多,你可以快速完成对数据的自动修改。

2.sed命令格式

命令格式如下
sed options script file

选项允许你修改sed命令的行为,可以使用的选项已在下表列出:

选项描述
-e script在处理输入时,将script中指定的命令添加到已有的命令中
-f file在处理输入时,将file中指定的命令添加到已有的命令中
-n不产生命令输出,使用print命令来完成输出

script参数指定了应用于流数据上的单个命令。如果需要用多个命令,要么使用-e选项在 命令行中指定,要么使用-f选项在单独的文件中指定。

2.1 sed 选项option

 -n, --quiet, --silent    取消自动打印模式空间
 -e 脚本, --expression=脚本   添加“脚本”到程序的运行列表
 -f 脚本文件, --file=脚本文件  添加“脚本文件”到程序的运行列表
 --follow-symlinks    直接修改文件时跟随软链接
 -i[扩展名], --in-place[=扩展名]    直接修改文件(如果指定扩展名就备份文件)
 -l N, --line-length=N   指定“l”命令的换行期望长度
 --posix  关闭所有 GNU 扩展
 -r, --regexp-extended  在脚本中使用扩展正则表达式
 -s, --separate  将输入文件视为各个独立的文件而不是一个长的连续输入
 -u, --unbuffered  从输入文件读取最少的数据,更频繁的刷新输出
 --help     打印帮助并退出
 --version  输出版本信息并退出
 -a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
 -c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
 -d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
 -i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
 -p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
 -s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法



2.2 sed 命令

a\\ 在当前行下面插入文本。
i\\ 在当前行上面插入文本。
c\\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。 
W file 写并追加模板块的第一行到file末尾。 
! 表示后面的命令对所有没有被选定的行发生作用。 
= 打印当前行号码。 
# 把注释扩展到下一个换行符以前。 

2.3 sed替换标记

g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记

2.4 sed元字符集

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

3. 在命令行使用编辑器命令

3.1 替换操作s命令

```
使用wang替换zhang
/data # sed 's/zhang/wang/' info.txt
wang    M    19
huahua    M    100
xiaowang M    10
xiaoming  M    21
xiaowei   F    22
xiaotian  F    34
wangming M    34



-n 和 p 结合操作只打印发生替换的行
/data # sed -n 's/zhang/wang/p' info.txt
wang    M    19
xiaowang M    10
wangming M    34

/data # cat info.txt
zhang    M    19
huahua    M    100
xiaozhang M    10
xiaoming  M    21
xiaowei   F    22
xiaotian  F    34
zhangming M    34


以上操作原文件内容不变,直接替换原文件中的内容使用- i 选项,后缀 /g 标记会替换每一行中的所有匹配,可用/ng表示从第n个匹配开始替换(如/2g,表示从第二个匹配处开始替换)

/data # sed -i 's/zhang/wang/g'  info.txt
/data # cat info.txt
wang    M    19
huahua    M    100
xiaowang M    10
xiaoming  M    21
xiaowei   F    22
xiaotian  F    34
wangming M    34

在Mac上-i 后面需要接一个字符串,用于生成更新后的文件名,:例如
sed -i.bak ‘s/zhang/wang/g’ info.txt
会生成info.txt.bak文件

正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:
/data # echo this is a cat | sed 's/\w\+/[&]/g'
[this] [is] [a] [cat]

3.2 删除命令:d(delete)

删除最后一行
cat user.txt | grep h | sed '$d'

删除第3行
sed '3d' info.txt

删除空白行
sed '/^$/d' info.txt

3.3. 在命令行使用多个编辑器命令-e,命令之间必须用分号隔开

$ sed -e 's/brown/green/; s/dog/cat/' info.txt

如果不想用分号,也可以用bash shell中的次提示符来分隔命令。只要输入第一个单引号标示 出sed程序脚本的起始(sed编辑器命令列表),bash会继续提示你输入更多命令,直到输入了标示 结束的单引号。
    $sed -e '
> s/brown/green/
> s/fox/elephant/
> s/dog/cat/' info.txt

4. 文件中读取编辑器命令

使用script1.sed中的命令处理data.txt

$ cat script1.sed 
$ /brown/green/ 
$ /fox/elephant/ 
$ /dog/cat/
$
$ sed -f script1.sed data1.txt
The quick green elephant jumps over the lazy cat. The quick green elephant jumps over the lazy cat. The quick green elephant jumps over the lazy cat. The quick g
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值