sed 之替换命令
- 把之前整理的ppt文档上传到博客,本篇主要介绍sed 的s命令,替换文本。
sed s/target/expect/ <in.txt >out.txt
echo "hello world"|sed s/world/jason/
先解释一下提一条命令:
s 代表替换
/ 是分隔符
target 正则表达式模式,查找模式 (这个可以写正则表达式匹配)
expect 是你要替换成的字符串
<in.txt 表示从int.txt 文件获取输入, 或者 sed s/target/expect/ in.txt >out.txt
>out.txt 表示输出结果到out.txt
sed s/target/expect/ <in.txt >out.txt
下面就写个从文件读取,然后输出到文件的例子。
创建两个文件 touch in.txt && touch out.txt
向in.txt 添加一个单词 echo "hello" >in.txt
先cat一下 in.txt 和 out.txt 里面的内容:
目标我们要把in.txt 当做标准输入,替换后的结果输出到out.txt 文件。
sed s/hello/world/ <in.txt >out.txt
执行完之后我们可以看一下结果:
in.txt 文件里面的内容没有改变,如果需要改变原文件可以
加 -i 参数,后面会介绍到这个参数。sed -i s/hello/world/ <in.txt >out.txt
out.txt 文件里面多了 world 这个单词。
那如果一行里面有两个 hello 会有怎样的结果呢?
echo "hello hello" >in.txt 覆盖输出到in.txt echo >out.txt 清空 out.txt 里面的结果
我们再次看一下out.txt文件中的内容:
Q & A
Q: 为什么第二个hello 没有被替换成 world?
A: sed,默认是以行为单位。你想改变一个单词,它只会
改变每行第一次出现的这个单词,你可能想改变行中的每
个单词。那么就需要加上一个g(global) 参数,全局替换.
sed s/hello/world/g <in.txt >out.txt
再看一下执行结果:
那么更多的问题来了:
1,如果需要替换第二个 hello 该怎么写
2,如果文件有多行,但是需要替换指定的行,或者一个范围怎么写
如果需要替换每一行第二个 hello 我们先看一下命令:
sed s/hello/world/2 <in.txt >out.txt 这样就可以了
sed s/hello/world/3g <in.txt >out.txt 修改每行第三个及以后的
sed 3s/hello/world/g <in.txt >out.txt 替换第三行所有匹配
sed 1,3s/hello/world/g <in.txt >out.txt 替换第一到第三行所有匹配
sed 3,$s/hello/world/g <in.txt >out.txt 替换第三行和第三行以后的所有行
最后再补充几个比较有用的正则的例子:
sed s/^/#/g file ^表示一行的开头,把file 文件的每行插入 # 号
sed s/$/@/g file $表示一行结尾,把file 文件每行结尾插入 @ 号
sed s/\<abc/test/g file \< 表示以abc 开头的单词, 把以abc 开头的单词替换成 test
sed s/\>bcd/test/g file \> 表示词尾,命令表示,把以bcd 结尾的单词替换成 test
sed s/<[^>]*//g file.html 正则表达式匹配,并删除标签对