使用 Bash 刪除副檔名
本教程討論使用 bash 指令碼通過 cut
命令和 basename
bash 命令剪下和顯示檔案特定欄位的方法。我們還將看到它與管道一起使用。然後,我們將看到從檔名中刪除副檔名時可能出現的一些問題。
我們還將檢視從檔名中修剪副檔名並僅顯示該檔名的詞幹版本的多個說明性示例。
使用 cut
方法刪除 Bash 中的副檔名
cut
方法用於從每一行修剪檔案的某些部分。此命令將檔名和選項(強制)作為引數,並在標準控制檯上輸出結果。我們也可以使用它來刪除副檔名。為此,-f
選項與檔名一起使用。一些可用選項的簡要說明如下。
-b
(位元組):此選項在指定位元組數之後從所有行中修剪部分文字。-c
(列):用於從檔案中剪下特定列或列範圍,並在 consol 上顯示剩餘部分。-f
(欄位):兩個分隔符號(第一個除外)之間的符號集合稱為欄位。對於檔案中的每一行,-f
僅顯示使用整數字段編號提到的欄位或行的部分。tab
預設情況下被視為分隔符。但是,我們可以使用-d
標誌來定義任何使用者定義的分隔符號。帶有-f
和d
選項的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
)。
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn