HOWTO · Bash

使用 Bash 刪除副檔名

使用 shell 指令碼及其與管道結合使用的 cut 命令刪除副檔名的分步指南。

本教程討論使用 bash 指令碼通過 cut 命令和 basename bash 命令剪下和顯示檔案特定欄位的方法。我們還將看到它與管道一起使用。然後,我們將看到從檔名中刪除副檔名時可能出現的一些問題。

我們還將檢視從檔名中修剪副檔名並僅顯示該檔名的詞幹版本的多個說明性示例。

使用 cut 方法刪除 Bash 中的副檔名

cut 方法用於從每一行修剪檔案的某些部分。此命令將檔名和選項(強制)作為引數,並在標準控制檯上輸出結果。我們也可以使用它來刪除副檔名。為此,-f 選項與檔名一起使用。一些可用選項的簡要說明如下。

  • -b(位元組):此選項在指定位元組數之後從所有行中修剪部分文字。
  • -c(列):用於從檔案中剪下特定列或列範圍,並在 consol 上顯示剩餘部分。
  • -f(欄位):兩個分隔符號(第一個除外)之間的符號集合稱為欄位。對於檔案中的每一行,-f 僅顯示使用整數字段編號提到的欄位或行的部分。tab 預設情況下被視為分隔符。但是,我們可以使用 -d 標誌來定義任何使用者定義的分隔符號。帶有 -fd 選項的 cut 命令的概要如下。
$ cut -f (comma separated field numbers) -d "delimiting symbol" filename.txt 

還有其他可用的選項,例如 -complement-output-delimiter-version。你可以使用 cut --help 獲取幫助以獲取更多資訊。

示例 1:從內容中刪除擴充套件

請考慮以下示例以瞭解有關 -f-d 的更多資訊。假設 webpages.txt 包含特定網站的不同 HTML 網頁的名稱,每一個都在一個新行中。讓我們通過在終端上執行 cat 命令來檢視 webpages.txt 的內容:-

$ cat webpages.txt
index.html
contact_us.html
login.html
dashboard.html

以下 bash 指令碼將刪除 pages.txt 中所有檔名的副檔名,並將輸出顯示到標準控制檯。假設我們建立了一個名為 script 的 shell 指令碼檔案,並在其中編寫了以下程式碼。

#!/bin/sh
#script file
file=webpages.txt
cut -f 1 -d '.' $file

這裡 -f 前面的 1 用於僅保留第一個欄位,而 .-d 選項中表示應使用 . 分隔欄位象徵。因此,該指令碼保留第一個 . 之前的每一行 pages.txt 中的所有文字。遇到。讓我們看看輸出。

輸出:

index
contact_us
login
dashboard

在這裡,如果我們將欄位編號設定為 2,則每行僅應在螢幕上列印第二個欄位(即 HTML)。

示例 2:使用管道從儲存在變數中的檔名中刪除副檔名並將其顯示在控制檯上

假設你要從儲存在變數中的檔名中刪除副檔名。下面的一段程式碼將做到這一點。

file=webpages.txt
echo "$file" | cut -f 1 -d '.'

輸出:

webpages

上面的程式碼通過管道將儲存在 file 變數中的檔名傳遞給 cut 命令,該命令僅保留文字的第一個欄位。

示例 3:使用管道從儲存在變數中的檔名中刪除副檔名並將其分配給另一個變數

file=webpages.txt
trimmed=$(echo "$filename" | cut -f 1 -d '.')
echo "$trimmed"

輸出

webpages

上述程式碼使用命令替換法將命令的輸出替換為命令的位置。因此,無論分配輸出的右側如何,都會分配 trimmed

在 Bash 中刪除副檔名時的問題

當檔名在檔名中包含分隔符本身時,上述公式將僅返回第一次遇到分隔符之前的文字。我們可以通過反向切割名稱來解決這個問題。

讓我們看看下面的程式碼。

file=abcd.efg.hmtl
trimmed=$(echo "$filename" | cut -f 2- -d '.')
echo "$trimmed"

輸出:

abcd

在上面的程式碼中,file 變數在賦值中多了一個點。輸出將包含第一個欄位中的所有文字,該欄位在遇到第一個點時結束。

解決方案:我們可以在將 file 的內容通過管道傳遞給 cut 命令之前對其進行反轉。之後,cut 命令將保留所有欄位,除了反轉文字中的第一個欄位。現在,需要再次反轉才能得到最終答案。

file=abcd.efg.html
trimmed=$(echo "$file" | rev | cut -f 2- -d '.' | rev)
echo "$trimmed"

輸出:

abcd.efg.html

請注意 f 選項值的變化。選項 -f 2- 用於保留位置值為 2 或更大的所有欄位。

在 Bash 中使用 basename 命令刪除副檔名

如果你知道副檔名,則可以使用 basename 命令從檔名中刪除副檔名。

file=abcd.abc.html
trimmed=$(basename $file .html)
echo "$trimmed"

輸出

abcd.abc

basename 命令的第一個命令列引數是變數名,副檔名是第二個引數。basename 命令掃描文字並列印第一次遇到副檔名之前的所有內容(在我們的例子中為 .html)。