Mac OS X安装gnu-sed/gnu-tar等命令行工具
由于Mac OS X自带的sed等命令行工具是基于BSD的,有一些缺陷和不足,所以会用 gnu 的命令加以替换
背景
由于Mac OS X自带的sed等命令行工具是基于BSD的,有一些缺陷和不足,比如
sed
不支持\t来表示TAB,在使用时非常不方便,因此考虑安装 gnu命令行工具来替代Mac自带的这些常用工具。
最常用的有问题的场景
- tar: 一些 transform 参数有问题
- sed: -i 替换文件的时候会报错
安装
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 里已经添加此模块
# 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: 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开始的。