問題:
我已經成功地使用以下 sed
命令在Linux中搜索/替換文本:
sed -i 's/old_string/new_string/g' /path/to/file
然而,當我在Mac OS X上嘗試時,我得到:
command i expects \ followed by text
我以為我的Mac運行的是一個正常的BASH shell。這是怎么了?
回答:
- 在 Linux 系統上使用命令
man sed
查看手冊,
NAME
sed - stream editor for filtering and transforming text
簡介是用于過濾和轉換文本的流編輯器。再翻到對 -i
選項的描述部分,
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
就地編輯文件(如果提供了后綴,則進行備份),可見參數后綴 SUFFIX
是可選的,即帶或者不帶這個參數都可以執行。
- 在 MacOS 系統上使用命令
man sed
查看手冊,
NAME
sed – stream editor
簡介是流編輯器。再翻到對 -i
選項的描述部分,
以類似于 -I
的方式就地編輯文件,但將每個文件與其他文件獨立處理。特別是,每個文件中的行號從1開始,“$” 地址與當前文件的最后一行匹配,并且地址范圍僅限于當前文件。最終結果是,每個文件都由一個單獨的 sed 實例編輯。可見 -i
后面是必選參數 extension,不寫上擴展名參數就會報錯,于是命令執行失敗。
如果要同一個命令在兩種系統上都成功執行,可寫成:
sed -i'' -e 's/old_string/new_string/g' /path/to/file
#或者
sed -i'.bak' -e 's/old_string/new_string/g' /path/to/file
筆者測試過的系統有:
- linux 5.4.0-131-generic #147-Ubuntu
- Darwin Kernel Version 21.6.0
參考:
- stackoverflow question 4247068
- man sed
相關閱讀:
- 為什么我不能在腳本中使用“cd“來更改目錄
- 2>&1是什么意思
- 如何使用bash腳本并行運行多個程序
- 為什么要使用xargs命令
- xargs命令用法實例