Linux/Mac上使用Terminal替换文件内容

本文最后更新于:2021年1月12日 下午

文章简介

本文章介绍使用trsed命令行工具在Mac和Linux上的使用教程。

tr命令–字符处理

tr命令适用于Mac和所有Linux发行版本

基本

1
2
tr [- Option] string1 string2
tr [- Option] string1

Option可以为:

  • -c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
  • -d 删除字符串1中所有输入字符。
  • -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。

如:替换abc文本内b的为c
输入:

1
echo "abc" | tr c b

输出:

1
abb

替换本地文件内字符

tr后可接文件参数,为文件绝对或相对路径。
如:将本路径下的1.txt文件内的a全部替换为b并存储为2.txt:
使用cat命令查看本地1.txt内文件内容:

1
cat 1.txt

输出:

1
aaa

使用tr命令替换a为b并储存为2.txt

1
tr a b <1.txt> 2.txt

使用cat命令查看2.txt文件里的内容:

1
cat 2.txt

输出:

1
bbb

另外,tr命令可以替换掉换行和空格字符:
tr替换换行或者回车时,可以这样:

1
tr '\n' ,

就是把换行替换为,

More

大小写转换

大小写转换,也可以通过[:lower][:upper]参数来实现。例如使用如下命令:

1
tr [:lower:] [:upper:] 

比如,本地before.txt文件内,我们用cat命令进行查看:

1
cat before.txt

输出:

1
abcdefg

我们可以使用tr命令,全局小写转大写并储存为after.txt:

1
tr [:lower:] [:upper:]  < before.txt > after.txt

Warning

tr命令为字符替换命令,不是字符串替换命令。如:尝试替换json文件内,overcodemintimate的话:
原json内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"app": {
"version": "8.0.4"
,"versionCode": "4768"
,"link": "http://www.overcode.cn/fileHost/download/MTM0Mzg5ODc0MDIzODMxOTYxOA=="
,"note": "https://gitee.com/mintimate/magick_custom_update_source/raw/master/note/app/manager.md"
},
"uninstaller": {
"link": "http://www.overcode.cn/fileHost/download/MTM0MDMwNDU3MDI0ODY1NDg1MA=="
},
"magisk": {
"version": "20.4"
,"versionCode": "20400"
,"link": "http://www.overcode.cn/fileHost/download/MTMzOTA0Njg4NDc2MDY2NjExMw=="
,"note": "https://gitee.com/mintimate/magick_custom_update_source/raw/master/note/installer/installer_stable.md"
,"md5": "9503fc692e03d60cb8897ff2753c193f"
},
"stub": {
"versionCode": "15",
"link": "http://www.overcode.cn/fileHost/download/MTM0Mzg5ODY2NDkxNzAwODM4NQ=="
},
"message":{
"Power By":"Mintimate"
,"My Bilibili":"Mintimate"
,"My Coolapk":"Mintimate"
,"Blog":"https://www.mintimate.cn"
}
}

替换后效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"app": {
"ittsimn": "8.0.4"
,"ittsimnCmat": "4768"
,"link": "http://www.mittimat.in/filtHmst/amwnlmaa/MTM0Mzg5ODi0MDIzODMxOTYxOA=="
,"nmtt": "https://gittt.imm/mintimatt/magiik_iustmm_upaatt_smutit/taw/masttt/nmtt/app/managtt.ma"
},
"uninstalltt": {
"link": "http://www.mittimat.in/filtHmst/amwnlmaa/MTM0MDMwNDU3MDI0ODY1NDg1MA=="
},
"magisk": {
"ittsimn": "20.4"
,"ittsimnCmat": "20400"
,"link": "http://www.mittimat.in/filtHmst/amwnlmaa/MTMzOTA0Njg4NDi2MDY2NjExMw=="
,"nmtt": "https://gittt.imm/mintimatt/magiik_iustmm_upaatt_smutit/taw/masttt/nmtt/installtt/installtt_stablt.ma"
,"ma5": "9503fi692t03a60ib8897ff2753i193f"
},
"stub": {
"ittsimnCmat": "15",
"link": "http://www.mittimat.in/filtHmst/amwnlmaa/MTM0Mzg5ODY2NDkxNzAwODM4NQ=="
},
"mtssagt":{
"Pmwtt By":"Mintimatt"
,"My Bilibili":"Mintimatt"
,"My Cmmlapk":"Mintimatt"
,"Blmg":"https://www.mintimatt.in"
}
}

可以看到,并不是overcode替换为mintimate,因为tr命令是字符替换,非字符串替换;如果是需要字符串替换,可以使用下文的sed命令。

sed命令-字符串处理

基本

1
sed [选项] [脚本命令] 文件名

删除

可以使用sed来删除文本:

1
2
3
4
5
# 删除New.txt文件内第二行到第五行文本
sed '2,5d' New.txt

# 删除New.txt文件内第三行到最后一行
sed '3,$d'

这样删除是将内容输出到屏幕上,需要覆盖原文件,加上-i参数。

替换

sed s 替换脚本命令
此命令的基本格式为:

1
[address]s/[string]/[replacestring]/[flag]

其中:

  • [address]:操作行数
  • [string]:需要替换的字符串
  • [replacestring]:需要替换成的字符串
  • [flag]:标记
flag的标记详解 功能
n 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g 对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file 将缓冲区中的内容写到指定的 file 文件中;
& 用正则表达式匹配的内容进行替换;
\n 匹配第 n 个子串,该子串之前在 pattern 中用 () 指定。
\ 转义(转义替换部分包含:&、\ 等)

比如:

1
2
3
4
5
6
7
8
9
10
11
# sed 编辑器只替换data0.log中每行中第 2 次出现的Linux改为Mac
sed 's/Linux/Mac/2' data0.log

# 替换第1行的每一个字符
sed '1s/./bug/g' data1.log

# 替换第1行的第1个字符
sed '1s/./bug/' data2.log

# 替换第1行的第5个字符
sed '1s/./bug/5' data3.log

其中,也可以使用转义替换:

1
2
# 替换http:///为https://mintimate.cn/
sed "s/http:\/\/\//https:\/\/mintimate.cn\//g" New.txt

替换并保存原文件:

1
2
3
4
5
6
7
# 替换overcode.cn为mintimate.cn

# Mac上操作
sed -i 's/overcode.cn/mintimate.cn/g' New.txt

# Linux上操作
sed -i '' 's/overcode.cn/mintimate.cn/g' New.txt

因为Mac基于unix,所以部分命令和Linux还是不一样的

递归目录替换

这个递归目录替换文件内的字符串,还是挺简单的。只需要配合grep即可
使用grep查找包含字符串的文件:

1
2
# 在当前目录,查找当前目录下所有包含HelloWorld的文件
grep “HelloWorld” -rl *

配合sed命令:

1
2
3
4
5
# Mac
sed -i "" "s/HelloWorld/你好世界/g" `grep "HelloWorld" -rl *`

# Linux
sed -i "s/HelloWorld/你好世界/g" `grep "HelloWorld" -rl *`

声明

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1upjuhny9163i


若对文章很感兴趣,可以B站关注我ヾ(≧▽≦*)o

点击图片跳转“关于”页面(○` 3′○)