本 markdown 文章由 leo-editor @auto-md 指令导出
gsed 安装
不要使用 macos 自带的 BSD sed,很多语法与 gnu-sed 不同,请安装 linux gnu-sed
brew install gnu-sed
安装好后,可以直接运行 gsed,也可以使用下面命令查看在 macos 下改成执行 sed 命令的方法(实际上就是 PATH 里的一个链接)
brew info gnu-sed
gnu-sed: stable 4.8 (bottled)
GNU implementation of the famous stream editor
https://www.gnu.org/software/sed/
Conflicts with:
ssed (because both install share/info/sed.info)
/usr/local/Cellar/gnu-sed/4.8 (12 files, 572.4KB) *
Poured from bottle on 2021-12-11 at 20:50:06
From: git://mirrors.ustc.edu.cn/homebrew-core.git/Formula/gnu-sed.rb
License: GPL-3.0-or-later
==> Caveats
GNU "sed" has been installed as "gsed".
If you need to use it as "sed", you can add a "gnubin" directory
to your PATH from your bashrc like:
PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
还有一个更加简单的文案,即更改 ~/.zshrc
alias sed='gsed'
gsed 在一个文件的每一行开头或结尾添加内容
例如,a.txt文件的内容如下:
test1
test2
在 a.txt 开头添加 hello 字符串。
sed -i s/^/hello/g a.txt
a.txt结果如下:
hellotest1
hellotest2
在 a.txt 结尾添加 hello 字符串。
sed -i s/$/hello/g a.txt
a.txt结果如下:
test1hello
test2hello
gsed 在一个文件前面或后面插入一行
Grammar:
gsed -i '1i \添加的内容' file #这是在第一行前添加字符串
gsed -i '1a \添加的内容' file #这是在第一行后添加字符串
gsed -i '$i \添加的内容' file #这是在最后一行行前添加字符串
gsed -i '$a \添加的内容' file #这是在最后一行行后添加字符串
Explain:
- 1 代表第一行
- $ 代表最后一行
- i 代表在定位的上一行插入
- a 代表在定位的最后一行插入
- -i 直接改文件内容,否则只把结果输出到终端
gsed 删除指定行
删除第一行
sed -i '1d' filename
删除第 n 行
sed -i 'nd' filename
删除最后一行
sed -i '$d' filename
gsed 批量处理文件
如批量替换多个文件指定字符串:
sed -i.bak 's/test_str/test/' `grep -rl test_str test_dir/*`
-
-i[extension],直接编辑文件选项,即直接修改文件内容,可以通过声明备份文件后缀备份修改的文件,如上述命令 .bak 即会备份一份修改前文件,后缀为.bak; 如果不声明后缀或声明 ‘’ 零长度后缀名,则不会备份即将修改的文件 -
's/test_str/test/' ,这里是文件修改模式,意图将字符串 test_str 替换为 test -
用 `` 声明组合命令,这里递归搜索 test_dir 目录,并且列出文件内容包含 test_str 字符串文件名称( -l 选项只会列出匹配到的一个文件名) `grep -rl test_str test_dir/*`
gsed 实操腾迅 flutter IM 集成时批量修改
问题1: 在聊天项目中,因为未使用 dart 空安全,但是腾迅 IM demo 的代码中使用了 dart 空安全,这样就导致 demo 报错。所以需要在每个 dart 文件的第一行加入 // @dart=2.14 ,以避免 demo 语法检测报错。
下面是操作步骤:
Step1 复制整个 demo 到鹿丁项目中
cp -R TencentIMFlutterDemo/lib/ ~/project/flutter_luding/lib/pages/tim/
Step2 查看需要加入 // @dart=2.14 dart 文件数量
find . -type f -name '*.dart' | wc -l 返回 81 个文件,太多了不要手工处理
Step3 在每个 dart 文件的第一行加入 // @dart=2.14
命令二选一
find . -type f -name '*.dart' | xargs gsed -i.bak '1i // @dart=2.14'
gsed -i.bak '1i // @dart=2.14' `find . -type f -name '*.dart'`
在更改之前对每个文件进行了备份 .bak 文件
查看更改结果
find . -type f -name '*.dart' | xargs head -n 2 查看被更改文件前两行
find . -type f -name '*.bak' | xargs head -n 2 查看备份文件前两行
问题2: 把 TencentIMFlutterDemo 移入到项目的 tim 目录后,各导入的 dart 库路径也发生了变化,需要按照鹿丁项目的路径去引用,下面进行替换处理。
Step1 查看有多少行 import 代码需要被替换
grep -r "package:tencent_im_sdk_plugin_example/" ./ | wc -l
一共有 410 行代码需要更改路径
Step2 整体进行替换还做了备份
grep -rl "package:tencent_im_sdk_plugin_example" ./ | xargs gsed -i.import_bak "s/package:tencent_im_sdk_plugin_example/package:flutter_luding\/pages\/tim/"
Step3 检查替换了多少行
grep -r "package:flutter_luding/pages/tim" ./ | wc -l
一共替换了 410 行代码
TencentIMFlutterDemo 一共有多少行代码
find . -type f -name '*.dart' | xargs wc -l | tail -n1
10313 total
|