如何在Bash中使用正则表达式匹配字符串?

34 浏览
0 Comments

如何在Bash中使用正则表达式匹配字符串?

我正在尝试编写一个包含函数的bash脚本,当给定一个.tar.tar.bz2.tar.gz等文件时,它会使用tar命令以相关的选项解压文件。\n我正在使用if elif then语句来测试文件名以确定其结尾,并且我无法使用正则表达式元字符进行匹配。\n为了避免不断重新编写脚本,我在命令行中使用\'test\',我认为下面的语句应该可以工作,我已经尝试了所有可能的括号、引号和元字符的组合,但仍然失败。\n

test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(返回1,表示假)

\n我确信问题很简单,而且我已经到处寻找过,但我无法弄清楚如何做到。有人知道我该怎么做吗?

0
0 Comments

问题的出现是因为在Bash中使用正则表达式匹配字符串时,有些特殊字符需要进行转义。在之前的回答中,使用了[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched这样的正则表达式来匹配字符串"sed-4.2.2.tar.bz2"是否以"tar.bz2"结尾。然而,这样的正则表达式中的点号"."实际上会匹配任何字符,而不仅仅是字符串"tar.bz2"中的点号。举例来说,[[ sed-4.2.2.tar4bz2 =~ tar.bz2$ ]] && echo matched[[ sed-4.2.2.tar§bz2 =~ tar.bz2$ ]] && echo matched也会被匹配到。因此,我们需要对点号进行转义,使其只匹配字符串中的点号。

解决方法是使用转义符"\\"对点号进行转义。我们可以这样写:[[ sed-4.2.2.tar.bz2 =~ tar\.bz2$ ]] && echo matched。这样,只有字符串"sed-4.2.2.tar.bz2"才会被匹配到。

或者,我们可以进一步严格一些,将之前的点号也包含在正则表达式中:[[ sed-4.2.2.tar.bz2 =~ \.tar\.bz2$ ]] && echo matched。这样,只有以".tar.bz2"结尾的字符串才会被匹配到。

通过以上的解决方法,我们可以在Bash中使用正则表达式来匹配字符串。

0
0 Comments

在Bash中,使用正则表达式与字符串匹配的问题是常见的。有时候,我们需要根据特定的模式来处理字符串,例如提取文件名和扩展名。

为了解决这个问题,我们可以编写一个函数来处理这个任务。下面是一个示例函数:

extract () {
  if [ -f $1 ] ; then
      case $1 in
          *.tar.bz2)   tar xvjf $1    ;;
          *.tar.gz)    tar xvzf $1    ;;
          *.bz2)       bunzip2 $1     ;;
          *.rar)       rar x $1       ;;
          *.gz)        gunzip $1      ;;
          *.tar)       tar xvf $1     ;;
          *.tbz2)      tar xvjf $1    ;;
          *.tgz)       tar xvzf $1    ;;
          *.zip)       unzip $1       ;;
          *.Z)         uncompress $1  ;;
          *.7z)        7z x $1        ;;
          *)           echo "don't know '$1'..." ;;
      esac
  else
      echo "'$1' is not a valid file!"
  fi
}

另外,如果我们需要将正则表达式存储在变量中,可以使用BASH_REMATCH变量来获取匹配的结果。${BASH_REMATCH[n]}将匹配正则表达式中用括号括起来的第n个组。例如,在下面的示例中,${BASH_REMATCH[1]}将匹配到"compressed",而${BASH_REMATCH[2]}将匹配到".gz"。

if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]]; 
then 
  echo ${BASH_REMATCH[2]} ; 
else 
  echo "Not proper format"; 
fi

需要注意的是,上述正则表达式并不适用于所有文件命名和扩展名的情况,但它在这个示例中是有效的。

另外,还需要注意的是,使用BSD tar时,可以使用"tar xf"命令来处理所有格式的压缩文件,而无需单独的命令或函数。

此外,7z工具可以解压多种格式的文件,包括AR、ARJ、CAB、CHM、CPIO、CramFS、DMG、EXT、FAT、GPT、HFS、IHEX、ISO、LZH、LZMA、MBR、MSI、NSIS、NTFS、QCOW2、RAR、RPM、SquashFS、UDF、UEFI、VDI、VHD、VMDK、WIM、XAR和Z。详情请参考7-zip官方网站:https://www.7-zip.org/

0
0 Comments

在Bash中如何使用正则表达式匹配字符串?

问题的原因:

在Bash中,要使用正则表达式进行匹配,需要使用`=~`运算符。然而,有些人可能不知道如何正确使用这个运算符,导致无法实现字符串的正则匹配。此外,有些人可能会尝试在正则表达式中使用引号,但这样做会导致匹配失败。

解决方法:

要使用`=~`运算符进行正则匹配,可以按照以下方法进行操作:

1. 使用双方括号`[[ ]]`来包裹匹配语句,例如:

[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched

2. 另一种方法是使用通配符替代正则表达式,并使用`==`运算符,例如:

[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched

需要注意的是,第二种方法中的通配符匹配与正则表达式不同,只能在双方括号`[[ ]]`内起作用,而不会像正则表达式那样在整个上下文中起作用。

另外,如果需要在正则表达式中使用引号,可以将正则表达式存储在变量中,并使用变量进行匹配,例如:

check="^a.*c$"
if [[ "abc" =~ $check ]]; then
    echo match
fi

此外,需要注意的是,不要在正则表达式中使用括号,例如以下写法是错误的:

[[ sed-4.2.2.tar.bz2 == "*tar.bz2" ]]

如果在匹配时需要进行否定操作,可以使用`!`运算符,例如:

[[ ! foo =~ bar ]]

最后,如果考虑到可移植性的问题,建议不要使用`=~`运算符,因为它可能在旧版本的Bash中不可用。而应该使用`[ ]`或`test`命令进行匹配。

要在Bash中使用正则表达式进行字符串匹配,可以使用`=~`运算符,并将匹配语句放在双方括号`[[ ]]`中。另外,可以使用通配符替代正则表达式进行匹配,使用`==`运算符。如果需要在正则表达式中使用引号,可以将正则表达式存储在变量中,并使用变量进行匹配。需要注意的是,不要在正则表达式中使用括号,而且在匹配时要注意否定操作的写法。最后,如果考虑到可移植性的问题,应该避免使用`=~`运算符,而使用`[ ]`或`test`命令进行匹配。

0