如何从Shell脚本中的文件名中提取字符串?

时间:2018-11-21 10:00:00

标签: regex bash shell unix

我需要从以下格式的文件名格式中获取包含字母字符和_的文本:oracle_NAME_OF_DB_USER.log,所以PARAM = NAME_OF_DB_USER。 在for循环中找不到最佳的正则表达式:

LIST=oracle_*.log

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

3 个答案:

答案 0 :(得分:2)

这是一个纯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

答案 1 :(得分:0)

假设您有如下文件集

> 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
> 

答案 2 :(得分:0)

那呢:

<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

正则表达式oracle[_A-Za-z0-9]*.log提及所有字符,小写字母和大写字母,数字和下划线。