Grep

從文件名中刪除特定(已知)副檔名(如果存在)

  • October 6, 2015

我什至不確定是否grep要用於單行數據中的正則表達式。Google搜尋讓我找到了這個前瞻表達式,它與grep匹配任何.ext文件並返回裸名:

XX@XX:/$ echo name.ext | grep -oP [^\.]+(?=.ext)
name

很好,但現在我提示使用者保存文件,我不確定他是否會鍵入帶有副檔名的名稱。我嘗試使先行成為有條件的,確保所有名稱都匹配,但這會返回我不理解的內容:

XX@XX:/$ echo name.ext | grep -oP "[^\.]+(?=.ext)?"
name
ext

如果我省略副檔名,它會起作用:

XX@XX:/$ echo name | grep -oP "[^\.]+(?=.ext)?"
name

那麼這是一個 grep 問題還是 regex 問題?也許我需要以某種方式使前瞻不擷取?

您可以使用 POSIX shell 替換來刪除.ext

file='name.ext'
printf '%s\n' "${file%.ext}"

要將無擴展字元串分配給新變數,請執行

noext="${file%.ext}"

使用您的方法(有更好的解決方案):

echo name | grep -oP '^[^.]+(?=(\.ext)?$)'

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