【问题标题】:bash script regex matchingbash 脚本正则表达式匹配
【发布时间】:2011-10-17 17:24:33
【问题描述】:

在我的 bash 脚本中,我有一个文件名数组,例如

files=( "site_hello.xml" "site_test.xml" "site_live.xml" )

我需要提取下划线和 .xml 扩展名之间的字符,以便循环遍历它们以在函数中使用。

如果这是 python,我可能会使用类似的东西

re.match("site_(.*)\.xml")

然后提取第一个匹配的组。

不幸的是,这个项目需要在 bash 中,所以 -- 我怎样才能在 bash 脚本中做这种事情?我不太擅长 grep、sed 或 awk。

【问题讨论】:

    标签: regex bash shell awk grep


    【解决方案1】:

    类似下面的东西应该可以工作

    files2=(${files[@]#site_})   #Strip the leading site_ from each element
    files3=(${files2[@]%.xml})    #Strip the trailing .xml
    

    编辑:纠正这两个错别字后,它似乎确实有效:)

    【讨论】:

    【解决方案2】:
    xbraer@NO01601 ~
    $ VAR=`echo "site_hello.xml" | sed -e 's/.*_\(.*\)\.xml/\1/g'`
    
    xbraer@NO01601 ~
    $ echo $VAR
    hello
    
    xbraer@NO01601 ~
    $
    

    这能回答你的问题吗?

    只需在反引号 (``) 中通过 sed 运行变量

    我不记得 bash 中的数组语法,但如果你正在编程 bash,我想你自己也很清楚;)

    如果不清楚,请不要犹豫再问。 :)

    【讨论】:

      【解决方案3】:

      我会使用cut 来拆分字符串。

      for i in site_hello.xml site_test.xml site_live.xml; do echo $i | cut -d'.' -f1 | cut -d'_' -f2; done
      

      这也可以在awk

      for i in site_hello.xml site_test.xml site_live.xml; do echo $i | awk -F'.' '{print $1}' | awk -F'_' '{print $2}'; done
      

      【讨论】:

        【解决方案4】:

        如果您使用的是数组,您可能不应该使用 bash。

        一个更合适的例子是

        ls site_*.xml | sed 's/^site_//' | sed 's/\.xml$//'
        

        这会产生由您想要的部分组成的输出。根据需要反引号或重定向。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-01
          • 2017-12-21
          • 2023-03-14
          • 2014-08-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多