Bash

僅在必要時從文本文件中刪除尾隨空格

  • November 9, 2021

我正在使用刪除尾隨空格

sed -i 's/[ \t]*$//' *.txt

但是,此命令將重寫所有文件。

有沒有一種方便的方法來判斷文本文件中是否有尾隨空格並跳過沒有尾隨空格的那些?

您可以使用grepfirst 來查找是否有需要修改的行,儘管在最壞的情況下仍會讀取文件兩次(在只有最後一行需要修改的情況下):

for f in ./*.txt; do
   grep -q '[[:blank:]]$' "$f" &&
     sed -i 's/[[:blank:]]*$//' "$f"
done

一種方法可以find/grep/sed如圖所示:

find . -maxdepth 1 -type f -name '*.txt' \
 -exec grep -q '[[:blank:]]$' {} \; \
 -exec sed -Ei -e 's/[[:blank:]]+$//' {} +
  • 如果 1 在目前目錄中執行,則使用 -maxdepth 進行查找。
  • {} \; 指的是傳遞給的文件的名稱,grep並且\;正在轉義作為命令結束指示符的 shell 元字元分號。我們逃避它,讓它到達-exec. 你也可以把它寫成';'
  • {} + 您現在已經知道{}了,這+意味著您傳遞了盡可能多的文件名sed(基本上,不是傳遞{}目前find結果中的單個,而是在呼叫之前累積一個{}用作參數的列表sed)。這使我們能夠最大限度地減少sed呼叫次數。

引用自:https://unix.stackexchange.com/questions/675881