【问题标题】:How to use wildcard in the middle on the string? bash如何在字符串中间使用通配符?重击
【发布时间】:2014-06-22 14:54:31
【问题描述】:

我正在编写一个 bash 脚本

我的文件是这样的: file="${nodeID}_00000_19700101010${ts}_udp_filtered.pcap"。是否可以使用任何 5 位数字代替 00000?我考虑过使用

file="${nodeID}_*_19700101010${ts}_udp_filtered.pcap"

有时我有 00001,有时是 00004,等等。

【问题讨论】:

  • "是否可以用任何 5 位数字代替 00000?"在什么情况下?
  • after some simulation I have many files like: 1_00000_19700101010009_udp_filtered.pcap 3_00000_19700101010009_udp_filtered.pcap 7_00002_19700101010013_udp_filtered.pcap and I would like to make file="${nodeID}_00000_19700101010${ts}_udp_filtered.pcap" working for任何 5digid 来代替 00000 就像文件的扩展名一样。当我输入*.pcap 时,我可以使用任何具有 .pcap 扩展名的文件。在我的情况下,我想处理所有文件,而不是 00000 他们有 00001 或 00009,不管
  • “使file=...工作” ...什么是“工作”?你在用file 做什么?如果匹配多个文件会怎样?

标签: bash filenames


【解决方案1】:

类似

 echo "${nodeID}"_[0-9][0-9][0-9][0-9][0-9]_19700101010"${ts}"_udp_filtered.pcap

注意,*[something] 不会在引号中展开,所以上面只引用了变量。

【讨论】:

    【解决方案2】:
    for match in ${nodeID}_*_19700101010${ts}_udp_filtered.pcap
    do
      #echo $match
      #do something with $match
      #file=$match
    done
    

    这将在目录中找到所有匹配项,并允许您对它们进行操作。星号将匹配 any 字符串,而不仅仅是 5 位数字。您可以在正则表达式中更具体,但如果您知道文件名的格式,则可以确定 * 是否安全或需要更具体。

    【讨论】:

    • for match in $(ls ${nodeID}_*_19700101010${ts}_udp_filtered.pcap) --- 永远不要使用$(ls ...),它坏了,不能做你想做的事。你想要for match in ${nodeID}_*_19700101010${ts}_udp_filtered.pcap。没有ls,没有$()
    • 你能详细说明“它坏了,不能做你想做的事”吗?它对我有用,它做我想做的事。您指的是一些特殊的边缘情况吗?
    • 尝试使用包含空格的文件名。还可以尝试一个与您的模式匹配的目录,其中包含大量文件。
    • @NanoDano 具体见this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2016-09-25
    • 2017-10-28
    • 2021-03-24
    相关资源
    最近更新 更多