sed
文本 2.txt 内容如下:
shell
1
2
3
4
5
11
121
abcabcc
1.替换文本指定字符或字符串,不更改原文件
将文本内容替换并输出,但不直接在原文档中修改:
sed "s/旧字符串/新字符串/g" 文档
范例,将文本中的
1
替换为b
shell
root@heihei:/# sed "s/1/b/g" 2.txt
b
2
3
4
5
bb
b2b
abcabcc
root@heihei:/#
2.替换文本指定字符或字符串,不更改原文件,存储更改的内容到新文件
再次查看文档 2.txt,内容是没有变化的,想要储存就需要把结果另存到新的文件中
如下:
shell
root@heihei:/# sed "s/1/b/g" 2.txt >> 3.txt
root@heihei:/# cat 3.txt
b
2
3
4
5
bb
b2b
abcabcc
root@heihei:/#
3.替换文本指定字符或字符串,直接更改原文件 加参数 -i
即可
shell
root@heihei:/# sed -i "s/1/b/g" 2.txt
root@heihei:/# cat 2.txt
b
2
3
4
5
bb
b2b
abcabcc
root@heihei:/#
4.替换文本指定字符或字符串,字符串为变量
sed "s/$old_str/$new_str/g" 文档
shell
root@heihei:/# new_str='b'
root@heihei:/# old_str='1'
root@heihei:/# sed "s/$old_str/$new_str/g" 2.txt
b
2
3
4
5
bb
b2b
abcabcc
注意,需要用 双引号 "",假设用的单引号 ''
命令需要改成 sed 's/'$old_str'/'$new_str'/g' 文档
否则无法执行成功:
失败案例:
shell
root@heihei:/# new_str='b'
root@heihei:/# old_str='1'
root@heihei:/# sed 's/$old_str/$new_str/g' 2.txt
1
2
3
4
5
11
121
abcabcc
root@heihei:/#
修改命令,成功达到预期结果
shell
root@heihei:/# new_str='b'
root@heihei:/# old_str='1'
root@heihei:/# sed 's/'$old_str'/'$new_str'/g' 2.txt
b
2
3
4
5
bb
b2b
abcabcc
root@heihei:/#
5.这里记录一次用 tr -t "旧字符串" "新字符串"
进行替换时遇到的坑
tr -t "旧字符" "新字符"
应该是这样的作用,接字符串时会出现问题
他的作用等同于sed "s/旧字符串/新字符串/g" 文档
,但是如果接字符串时,并不是我认为的
将符合的字符串进行替换,而是依旧按照单字符挨个替换,如下
如下:
shell
root@sh-z390-01:~/test/sed# x="0010086,sds"
root@sh-z390-01:~/test/sed# echo $x |tr -t "10086" "01472"
4404472,sds
root@sh-z390-01:~/test/sed# echo $x |tr -t "10086" "01"
1101186,sds
如上面的例子,我们指定了旧字符串 "10086",新字符串"01472"
但实际执行下来是将$x中所有的 1
更改为了0
,所有的0
改成了1
随后又被改为了4
,8
改成7
,6
改成2
实际上是按照
1 --> 0
0 --> 1
0 --> 4
8 --> 7
6 --> 2
这样的映射关系进行的单字符替换