Mac OS X安装gnu-sed/gnu-tar等命令行工具

由于Mac OS X自带的sed等命令行工具是基于BSD的,有一些缺陷和不足,所以会用 gnu 的命令加以替换
更新于: 2023-09-25 08:58:26

背景

由于Mac OS X自带的sed等命令行工具是基于BSD的,有一些缺陷和不足,比如 sed 不支持\t来表示TAB,在使用时非常不方便,因此考虑安装 gnu命令行工具来替代Mac自带的这些常用工具。

最常用的有问题的场景

  • tar: 一些 transform 参数有问题
  • sed: -i 替换文件的时候会报错
用 gsed 代替 sed

安装

brew install coreutils
brew install gnu-sed
brew install gnu-tar

# 或者一步
brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt grep

自己的 ushell-module-macos 里已经添加此模块

https://apple.stackexchange.com/questions/69223/how-to-replace-mac-os-x-utilities-with-gnu-core-utilities

# coreutils
export PATH="$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH";
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH";

# check
ls -alh /usr/local/opt/coreutils/libexec/gnubin

# gun-sed
export PATH="$(brew --prefix gnu-sed)/libexec/gnubin:/usr/local/bin:$PATH";
export PATH="$(brew --prefix gnu-tar)/libexec/gnubin:/usr/local/bin:$PATH";
export PATH="$(brew --prefix gawk)/libexec/gnubin:/usr/local/bin:$PATH";

安装前/后: 

bsd tar VS gnu-tar 安装前后,对比

❯ tar --version
bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6

❯ tar --version
tar (GNU tar) 1.34
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.

tar 不同系统中使用

不同的 tar 使用过程中的一些 warning 提示
tar: Ignoring unknown extended header keyword `SCHILY.fflags
报错可以忽略,不必担心。产生这个报错的原因是,这个tar文件是在MAC OS X中建立的,Mac OS X 使用的是BSD tar,它会产生一些GNU tar无法识别的额外的信息,常见的linux发行版用的是GNU tar。

测试

  • test.txt
{'DATE': 'Fri, 03 Jun 2022 16:09:26 GMT', 'Server': 'Apache', 'Strict-Transport-Security': 'MAX-age=31536000; includeSubDomains; preload', 'Referrer-Policy': 'origin-when-cross-origin', 'Content-Security-Policy': 'upgrade-insecure-requests', 'Cache-Control': 'private', 'NCBI-PHID': '358D4DAD29A30D01000000FFFFFF0002.1.m_3', 'NCBI-SID': 'CE89FE6429A32321_1531SID', 'X-Content-Type-Options': 'nosniff', 'Content-Type': 'text/plain', 'Set-Cookie': 'ncbi_sid=CE89FE6429A32321_1531SID; domain=.nih.gov; path=/; expires=Sat, 03 Jun 2023 16:09:26 GMT', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'X-UA-Compatible': 'IE=Edge', 'X-XSS-Protection': '1; mode=block', 'Keep-Alive': 'timeout=1, MAX=10', 'Connection': 'Keep-Alive', 'Transfer-Encoding': 'chunked'}
sed -i s/MAX/max/g test.txt

关于 gexpr

#!/bin/bash/

str="i love you"

echo `expr index "$str" l`
echo `expr index "$str" you` #最后一个参数是字符,会对后面字符串每一个单独查找,返回最靠前的index
echo `expr index "$str" o`
echo `expr length "$str"` #字符串长度
echo `expr substr "$str" 1 6` #从字符串中位置1开始截取6个字符。索引是从0开始的。

参考