本 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
Logo

更多推荐