Regex 如何在shell脚本中从文件名中提取字符串?

Regex 如何在shell脚本中从文件名中提取字符串?,regex,bash,shell,unix,Regex,Bash,Shell,Unix,我需要从这个文件名格式中获取包含字母字符和u的文本:oracle_name_of_DB_USER.log,所以PARAM=name_of_DB_USER。 在for循环中找不到要使用的最佳正则表达式: LIST=oracle_*.log for file in $LIST; do . . . USER=${extracted_file_name} 假设您有一组如下所示的文件 > ls -1 oracle* oracle_ABC_USER_1.log oracle_ABC_USER_2.

我需要从这个文件名格式中获取包含字母字符和u的文本:oracle_name_of_DB_USER.log,所以PARAM=name_of_DB_USER。 在for循环中找不到要使用的最佳正则表达式:

LIST=oracle_*.log

for file in $LIST; do
.
.
.
USER=${extracted_file_name}

假设您有一组如下所示的文件

> ls -1 oracle*
oracle_ABC_USER_1.log
oracle_ABC_USER_2.log
oracle_ABC_USER_ADMIN_1.log
oracle_ABC_USER_ADMIN_2.log
oracle_NAME_OF_DB_USER.log
下面的perl命令应该为您提供所需的名称

> perl -ne ' BEGIN { @files=glob("oracle*.log"); foreach (@files) {s/^oracle_(.*)\.log/_\1/g; print "$_\n"} exit } '
_ABC_USER_1
_ABC_USER_2
_ABC_USER_ADMIN_1
_ABC_USER_ADMIN_2
_NAME_OF_DB_USER
> 
这有用吗

更紧凑的一个:

> perl -ne ' BEGIN { s/^oracle_(.*)\.log/_\1/g and print "$_\n" for glob("oracle*.log"); exit}'
_ABC_USER_1
_ABC_USER_2
_ABC_USER_ADMIN_1
_ABC_USER_ADMIN_2
_NAME_OF_DB_USER
> 
那么这个呢:

<Prompt>:/C/Temp_Folder/tralala$ ls -ltra
total 0
drwxrwxrwx 1 Username Groupname 512 Nov 21 11:43 ..
-rwxrwxrwx 1 Username Groupname   0 Nov 21 11:44 oracle_ABC.log
-rwxrwxrwx 1 Username Groupname   0 Nov 21 11:44 oracle_123.log
-rwxrwxrwx 1 Username Groupname   0 Nov 21 11:44 oracle_ABC_123.log
-rwxrwxrwx 1 Username Groupname   0 Nov 21 11:44 something_else.log
drwxrwxrwx 1 Username Groupname 512 Nov 21 11:48 .
<Prompt>:/C/Temp_Folder/tralala$ ls -ltra | grep "oracle[_A-Za-z0-9]*.log"
-rwxrwxrwx 1 Username Groupname   0 Nov 21 11:44 oracle_ABC.log
-rwxrwxrwx 1 Username Groupname   0 Nov 21 11:44 oracle_123.log
-rwxrwxrwx 1 Username Groupname   0 Nov 21 11:44 oracle_ABC_123.log
:/C/Temp\u文件夹/tralala$ls-ltra
总数0
DRWXRWX 1用户名组名512 11月21日11:43。。
-rwxrwx 1用户名组名0 11月21日11:44 oracle_ABC.log
-rwxrwx 1用户名组名0 11月21日11:44 oracle_123.log
-rwxrwx 1用户名组名0 11月21日11:44 oracle_ABC_123.log
-rwxrwx 1用户名组名0 11月21日11:44 something_else.log
DRWXRWX 1用户名组名512 11月21日11:48。
:/C/Temp_Folder/tralala$ls-ltra | grep“oracle[_A-Za-z0-9]*.log”
-rwxrwx 1用户名组名0 11月21日11:44 oracle_ABC.log
-rwxrwx 1用户名组名0 11月21日11:44 oracle_123.log
-rwxrwx 1用户名组名0 11月21日11:44 oracle_ABC_123.log

正则表达式
oracle[\u A-Za-z0-9]*.log
提到了所有字符、小写字母和大写字母、数字和下划线。

下面是一个纯粹的BASH答案:

for file in oracle_ABC_USER_1.log oracle_ABC_USER_2.log oracle_ABC_USER_ADMIN_1.log oracle_ABC_USER_ADMIN_2.log oracle_NAME_OF_DB_USER.log; do
    [[ $file =~ oracle_(.*)[.]log ]]
    echo ${BASH_REMATCH[1]}
done
下面是上述命令的输出:

ABC_USER_1
ABC_USER_2
ABC_USER_ADMIN_1
ABC_USER_ADMIN_2
NAME_OF_DB_USER

模式文件是oracle_uu.log吗?@stack0114106 yesThank you@accdias BASH_urematch对我来说是新的,很高兴现在发现:)不客气。:-)