「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。
作者:Mintimate
Mintimate's Blog,只为与你分享
新手有没有用过Linux上的
sed和tr命令呢?如果没有,那就来看看这篇文章,来入个门吧~~
文章简介
本文章介绍使用tr和sed命令行工具在Mac和Linux上的入门使用教程。
tr命令--字符处理
tr命令适用于Mac和所有Linux发行版本
基本
tr [- Option] string1 string2
tr [- Option] string1
Option可以为:
-c用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。-d删除字符串1中所有输入字符。-s删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
如:替换abc文本内b的为c:
输入:
echo "abc" | tr c b
输出:
abb
替换本地文件内字符
tr后可接文件参数,为文件绝对或相对路径。
如:将本路径下的1.txt文件内的a全部替换为b并存储为2.txt:
使用cat命令查看本地1.txt内文件内容:
cat 1.txt
输出:
aaaAAAbbbBBB
使用tr命令替换a为b并储存为2.txt:
tr a b <1.txt> 2.txt
使用cat命令查看2.txt文件里的内容:
cat 2.txt
输出:
bbbAAAbbbBBB
另外,tr命令可以替换掉换行和空格字符:
tr替换换行或者回车时,可以这样:
tr '\n' ,
就是把换行替换为,
更多
大小写转换
大小写转换,也可以通过[:lower]和[:upper]参数来实现。例如使用如下命令:
tr [:lower:] [:upper:]
比如,本地before.txt文件内,我们用cat命令进行查看:
cat before.txt
输出:
abcdefg
我们可以使用tr命令,全局小写转大写并储存为after.txt:
tr [:lower:] [:upper:] < before.txt > after.txt
因为我使用的是zsh,所以需要用''对
[:lower]进行包装,否则zsh会以为是通配符,读取为命令::、l等。
当然,更多情况是用在cat命令组合,方便对大写字母/单词,小写化,增加可读性:
cat before.txt |tr [:upper:] [:lower:]
警告
tr命令为字符替换命令,不是字符串替换命令。如:尝试替换json文件内,overcode为mintimate的话:
原json内容:
{
"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"
}
}
替换后效果:
{
"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命令-字符串处理
基本
sed [选项] [脚本命令] 文件名
删除
可以使用sed来删除文本:
# 删除New.txt文件内第二行到第五行文本
sed '2,5d' New.txt
# 删除New.txt文件内第三行到最后一行
sed '3,$d'
这样删除是将内容输出到屏幕上,需要覆盖原文件,加上-i参数。
替换
sed 替换脚本命令 此命令的基本格式为:
[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 中用 () 指定。 |
| \ | 转义(转义替换部分包含:&、\ 等) |
比如:
# 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
其中,也可以使用转义替换:
# 替换http:///为https://mintimate.cn/
sed "s/http:\/\/\//https:\/\/mintimate.cn\//g" New.txt
替换并保存原文件:
# 替换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查找包含字符串的文件:
# 在当前目录,查找当前目录下所有包含HelloWorld的文件
grep “HelloWorld” -rl *
配合sed命令:
# Mac
sed -i "" "s/HelloWorld/你好世界/g" `grep "HelloWorld" -rl *`
# Linux
sed -i "s/HelloWorld/你好世界/g" `grep "HelloWorld" -rl *`
END
以上就是tr和sed命令的入门介绍了嗷。可能还是配置grep等命令使用比较实际。
有机会和大家分享其他Linux命令吧。另外,记得使用[参数]时候,如果是ZSH,记得使用''对其包裹嗷。
zsh是不是没介绍?有机会和大家分享oh-my-zsh吧。