我有這樣的字串:
/my/directory/file1_AAA_123_k.txt
/my/directory/file2_CCC.txt
/my/directory/file2_KK_45.txt
所以基本上,下劃線的數量是不固定的。我想提取第一個下劃線和點之間的字串。所以輸出應該是這樣的:
AAA_123_k
CCC
KK_45
我發現這個解決方案有效:
string='/my/directory/file1_AAA_123_k.txt'
tmp="${string%.*}"
echo $tmp | sed 's/^[^_:]*[_:]//'
但我想知道是否有更“優雅”的解決方案(例如 1 行代碼)
謝謝!
uj5u.com熱心網友回復:
使用bash版本 >= 3.0 和正則運算式:
[[ "$string" =~ _(. )\. ]] && echo "${BASH_REMATCH[1]}"
uj5u.com熱心網友回復:
您可以使用單個sed命令,例如
sed -n 's~^.*/[^_/]*_\([^/]*\)\.[^./]*$~\1~p' <<< "$string"
sed -nE 's~^.*/[^_/]*_([^/]*)\.[^./]*$~\1~p' <<< "$string"
請參閱在線演示。詳情:
^- 字串的開始.*- 任何文字/- 一個/字符[^_/]*/- 除了and之外的零個或多個字符__- 一個_字符\([^/]*\)(POSIX BRE) /([^/]*)(POSIX ERE, 通過E選項啟用) - 第 1 組:任何零個或多個字符,除了/\.- 一個點[^./]*.- 除了and 之外的零個或多個字符/$- 字串結束。
使用-n,默認行輸出被抑制,p只列印成功替換的結果。
uj5u.com熱心網友回復:
如果您需要一次處理一個檔案名(例如,在while read回圈中),您可以執行兩個引數擴展,例如:
$ string='/my/directory/file1_AAA_123_k.txt.2'
$ tmp="${string#*_}"
$ tmp="${tmp%%.*}"
$ echo "${tmp}"
AAA_123_k
同時決議檔案名串列的一個想法:
$ cat file.list
/my/directory/file1_AAA_123_k.txt.2
/my/directory/file2_CCC.txt
/my/directory/file2_KK_45.txt
$ sed -En 's/[^_]*_([^.] ).*/\1/p' file.list
AAA_123_k
CCC
KK_45
uj5u.com熱心網友回復:
使用sed
$ sed 's/[^_]*_//;s/\..*//' input_file
AAA_123_k
CCC
KK_45
uj5u.com熱心網友回復:
這很容易,除了它包含初始下劃線:
ls | grep -o "_[^.]*"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/434594.html
上一篇:BashShell腳本問題
