linux 之 sed (一)—— 字符串替换入门
处理数据如果只会R语言就很吃亏了,毕竟很多时候一行命令就能解决的事情,如果用R
处理,可能要写一大段,说不定运行速度还慢呢。
稍微对linux
有点了解的人,可能都听过sed
、grep
和awk
这三剑客。今天我们就来谈谈sed
的一些常用命令。
1、基本语法
sed 's/source_str/replace_str/' input_file
s
表示替换,/
: 定界符,它可以是任何字符。sed 's:source_str:replace_str:'
source_str
: 要搜索的普通字符串或正则表达式。replace_str
: 替换字符串input_file
: 要在其上运行命令的文件
如果需要替换的字符串中含有单引号'‘
,外层引号可以换成双引号""
2、非全局替换
我们先创建一个1.txt的文件
$cat 1.txt
temp data day
bigdata day mydata
tdata my one
假设我们想将文件中的data
字符串替换成abc
$sed 's/data/abc/' 1.txt > 2.txt
我们一起看下结果
$cat 2.txt
temp abc day
bigabc day mydata
tabc my one
显而易见,data
字符已经被abc
替换了,但是细心的朋友肯定也发现了第三列的mydata
并没有被替换。
3、全局替换
如果要完成全局替换,那么后面要加上g
$sed 's/data/abc/g' 1.txt > 2.txt
$cat 2.txt
temp abc day
bigabc day myabc
tabc my one
4、原文件替换
当然,如果你想要直接简单粗暴的在原始文件中直接进行替换,可以加上-i参数
$sed -i 's/data/abc/g' 1.txt
$cat 1.txt
temp abc day
bigabc day myabc
tabc my one
5、指定位置替换
如果你想要在某一个指定的行或者指定的段落之间进行字符串的替换的话,sed命令也是可以帮到你的。
一些特殊字符的使用
^
: 表示行首$
: 符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行)&
: 表示匹配到的字符串
假设现在只在以temp为开头的行中,将abc
替换成data
$sed '/^temp/s/abc/data/g' 1.txt > 2.txt
$cat 2.txt
temp data day
bigabc day myabc
tabc my one
命令中的^
符号是以什么字符开头的意思
那么要在以temp
开头和bigabc
开头的段落之间完成替换的命令就是
$sed '/^temp/,/^big/s/abc/data/g' 1.txt > 2.txt
$cat 2.txt
temp data day
bigdata day mydata
tabc my one
所以以上第三行就没有进行替换。
6、指定行替换
sed 's/^/aaa&/g' # 在所有行首添加aaa
sed 's/$/&aaa/g' # 在所有行末添加aaa
sed '2s/source/replace/g' # 在第2行替换
sed '$s/source/replace/g' # 在最后一行替换
sed '2,5s/source/replace/g' # 在2到5行之间替换
sed '2,$s/source/replace/g' # 在2到最后一行之间替换
其他
- 同时执行多个替换规则
sed 's/^/aaa&/g;s/$/&aaa/g' # 同时在所有行首、行尾添加aaa
好啦,今天替换就讲到这里啦,累了哈哈哈哈哈。
留言