本文是要讲linux 不打开文档/文件的情况下,替换文本内容。
打开文档,在文档/文件内替换内容的,可以用vim,可参考这篇文章vim 替换文本 。
话题相关
#linux 文件替换字符串
#sed 字符串替换
#shell 文件替换某行
#linux 替换指定行内容
#linux 替换某行
linux一般用sed来替换文本到指定行。
s
(substitute)为查找替换命令
# 在输出或打印中,替换字符串。并不改变原文件内容
sed '作用范围s/替换查找目标/替换成为/替换目标option' 文件名
# 替换字符串,并更改原文件内容
# 在sed后面加 -i,即编辑文档“edit files in place”选项
sed -i '作用范围s/替换查找目标/替换成为/替换目标option' 文件名
例,sed ‘s/cat/dog/g’ pet.txt
在全局范围(s前的作用范围无内容)查找cat并替换为dog,作用范围内每一行出现的不仅第一个目标,而是所有目标都会被替换(g)。
# 作用范围在全文
sed 's/cat/dog/g' pet.txt
这一点这vim中的作用范围不太一样,vim中不写作用范围是作用于光标所在的当前行,而sed是指全文范围的每一行。
# 作用范围在第1行
sed '1s/cat/dog/g' pet.txt
# 作用范围在第6行到第10行
sed '6,10s/cat/dog/g' pet.txt
# 作用范围在第6行到最后一行
sed '6,$s/cat/dog/g' pet.txt
# 作用范围在指定行到其后2行,用加号(减号不可用)
sed '1,+2s/cat/dog/g' pet.txt
# 替换cat这个字符串
sed '1s/cat/dog/g' pet.txt
.*
# 替换第1行一整行为dog
sed '1s/.*/dog/' pet.txt
# 这里因为.*已代表一整行,所有后面写上/g和上面相同效果
sed '1s/.*/dog/g' pet.txt
# 替换全文的每1行为dog
sed 's/.*/dog/' pet.txt
# 这里因为.*已代表一整行,所有后面写上/g和上面相同效果
sed 's/.*/dog/g' pet.txt
例,
$ cat test.txt
a,b,c
a,b,c
# 替换第1行整行
$ sed '1s/.*/hello/g' test.txt
hello
a,b,c
$ sed '1s/.*/hello/' test.txt
hello
a,b,c
# 替换全文每一行的全部内容
$ sed 's/.*/hello/g' test.txt
hello
hello
$ sed 's/.*/hello/' test.txt
hello
hello
.
# 替换第1行的每一个字符
sed '1s/./dog/g' pet.txt
# 替换第1行的第1个字符
sed '1s/./dog/' pet.txt
# 替换第1行的第5个字符
sed '1s/./dog/5' pet.txt
例,
$ echo '123'|sed 's/./dog/g'
dogdogdog
$ echo '123'|sed 's/./dog/'
dog23
$ echo '123'|sed 's/./dog/3'
12dog
# 字符也包括符号
$ echo ',123'|sed 's/./dog/1'
dog123
g
,作用范围内行的所有查找目标,而不仅是第一个查找目标# 替换全文每一行的每一个 cat 为 dog
sed 's/cat/dog/g' pet.txt
# 替换全文每一行的第1个 cat 为 dog
sed 's/cat/dog/' pet.txt
-n
,是阻止默认的自动打印模式的选项,p
,表明打印print。# 打印发生替换的行
sed -n 's/cat/dog/gp' pet.txt
不同于上面的s
命令,以字符串或模式为单位替换为一个整体,y
是罗列置换每个对应的字符。
语法
sed 'y/查找的各个字符/对应替换后的各个字符/' 文件名
sed ‘y/abc/123’ test.txt ,这个命令会依次替换a,b,c为1,2,3 。
查找的各个字符
与对应替换后的各个字符
的长度要一致。
例,
$ echo 'a,b,c,d,e'|sed 'y/abcde/12345/'
1,2,3,4,5
$ cat test.txt
a,b,c
a,b,c
$ sed 'y/abcde/12345/' test.txt
1,2,3
1,2,3
再比如 $ sed ‘1,5y/abcde/ABCDE/’ test.txt 是把1-5行内所有abcde转变为大写,但是,正则表达式元字符不能使用这个命令。
例,
$ cat copy.txt
wang yi
zhang san
li qi
# 想要把1-2行的小写转化为大写,正则表达式不可用
$ sed '1,2y/[a-z]/[A-Z]/' copy.txt
wAng yi
ZhAng sAn
li qi
# 罗列全部字母,来替换
$ sed '1,2y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' copy.txt
WANG YI
ZHANG SAN
li qi
(以上。)