【问题标题】:How extract string from file name in shell script? [duplicate]如何从shell脚本中的文件名中提取字符串? [复制]
【发布时间】:2018-11-21 09:59:59
【问题描述】:

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

LIST=oracle_*.log

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

【问题讨论】:

  • 是模式oracle_.log的文件吗?
  • @stack0114106 是

标签: regex bash shell unix


【解决方案1】:

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

【讨论】:

  • 谢谢@accdias BASH_REMATCH 对我来说是新的,很高兴现在发现它:)
  • 不客气。 :-)
【解决方案2】:

假设您有一组如下文件

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

【讨论】:

    【解决方案3】:

    这个呢:

    <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 提及所有字符、小写字母和大写字母、数字和下划线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      相关资源
      最近更新 更多