簡體   English   中英

BASH:如何提取由特定文本包圍的子字符串

[英]BASH: How to extract substring that is surrounded by specific text

我正在嘗試從遵循特定模式的文件名中提取數字:

file-8923489_something.txt
another_file-8923489_something.txt
some-other_file-8923489_something.txt

我想提取介於文本“ file-”和“ _something”之間的數字,該數字可與以上3個文件名一起使用。

最好的方法是什么?

是否可以僅使用##和%%等運算符來執行此操作? 怎么樣:

filename=file-8923489_something.txt
file=${${filename##*file}%%_something}}

但是,它沒有按我預期的那樣工作。

使用BASH之前的正則表達式:

x="some-other_file-8923489_something.txt"
[[ "$x" =~ file-([0-9]*)_something ]] && echo ${BASH_REMATCH[1]}
8923489

或此grep -P也將起作用:

grep -oP "file-\K\d+(?=_something)" file
8923489
8923489
8923489

或使用awk:

awk -F 'file-|_something' '{print $2}' file
8923489
8923489
8923489

使用grep

$ echo "file-8923489_something.txt
another_file-8923489_something.txt
some-other_file-8923489_something.txt" | grep -Po '(?<=file-)\d+'
8923489
8923489
8923489

或使用純bash

d="your_string"
d1=${d%_*}
your_final_string=${d1##*-}

測試

$ d="file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
file-8923489
$ echo ${d1##*-}
8923489

$ d="some-other_file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
some-other_file-8923489
$ echo ${d1##*-}
8923489

$ d="another_file-8923489_something.txt"
$ d1=${d%_*}
$ echo $d1
another_file-8923489
$ echo ${d1##*-}
8923489

是否可以僅使用運算符來執行此操作,...

$ filename="file-8923489_something.txt"
$ file=${foo//[^0-9]/}
$ echo $file
8923489

您可能要參考Shell參數擴展

或者,您可以說:

$ file=$(tr -dc '[[:digit:]]' <<< "$filename")
$ echo $file
8923489

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM