Linux/Mac上使用tr和sed命令直接在Terminal上替换文本内容

1,028 阅读5分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

作者:Mintimate

博客:www.mintimate.cn

Mintimate's Blog,只为与你分享

新手有没有用过Linux上的sedtr命令呢?如果没有,那就来看看这篇文章,来入个门吧~~

文章简介

本文章介绍使用trsed命令行工具在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:]

配合cat命令

警告

tr命令为字符替换命令,不是字符串替换命令。如:尝试替换json文件内,overcodemintimate的话: 原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的标记详解功能
n1~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

以上就是trsed命令的入门介绍了嗷。可能还是配置grep等命令使用比较实际。

有机会和大家分享其他Linux命令吧。另外,记得使用[参数]时候,如果是ZSH,记得使用''对其包裹嗷。

zsh是不是没介绍?有机会和大家分享oh-my-zsh吧。