【问题标题】:variable in a grep commandgrep 命令中的变量
【发布时间】:2018-03-05 13:40:13
【问题描述】:

我想从文本文件 MODIS_list.txt 中提取一个字符串:

wget https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MOD09GA/2018/062/ -O MODIS_list.txt

然后提取 MODIS 文件的名称:

less MODIS_list.txt | grep -o -P '(?<=hdf">).*(?<=(MOD09GA.A2018062.h18v04.006)).*(?=</a>)'

作为输出给出

MOD09GA.A2018062.h18v04.006.2018064030133.hdf

假设我想遍历更多文件更改,例如日期或产品。

prod_var=MOD09GA
prod_date=2018062

如何在 grep 命令中插入这两个变量!??

我尝试了以下语法,但它不起作用:

less MODIS_list.txt | grep -o -P '(?<=hdf">).*(?<=($prod_var.A$prod_date.h18v04.006)).*(?=</a>)'

【问题讨论】:

  • 变量不插入单引号字符串,使用双引号。
  • 您想从 MODIS_list.txt 文件中提取哪个字符串(上面的第一步)?
  • 您的意思是less MODIS_list.txt 还是(可能更好)cat MODIS_list.txt
  • @PierreFrançois 是的也可以使用cat 我想提取满足模式的MODIS产品:MOD09GA.A2018062.h18v04.006*
  • 实际上grep 非常了解如何自己读取文件; grep 'regex' MODIS_list.txt。另见useless use of cat.(毫无用处的less当然是无价的。)

标签: bash grep pattern-matching


【解决方案1】:

尽管如此,我建议您不要使用怪物正则表达式,而是将 html 文件转换为 xml 文件并通过 xpath 选择来选择所需的节点,如下所示:

tidy -q -f /dev/null -asxml --numeric-entities yes MODIS_list.txt | /usr/bin/xpath -q -e "//a[contains(@href,'$prod_var.A$prod_date.h18v04.006.2018064030133.hdf')]/text()"

【讨论】:

    【解决方案2】:

    你要执行的命令是:

    grep -o -P "(?<=hdf\\\">).*(?<=($prod_var.A$prod_date.h18v04.006)).*(?=</a>)" MODIS_list.txt
    

    正如 wolfrevokcats 所说(但您需要知道他们在说什么),您必须将单引号更改为双引号。问题是你在字符串 hdf 后面有一个引号,它必须被转义两次:一次用于 shell,一次用于 grep,但同样你需要知道我在说什么。避免在“hdf”右侧转义引号问题的另一种解决方案是使用“。”如下:

    grep -o -P "(?<=hdf.>).*(?<=($prod_var.A$prod_date.h18v04.006)).*(?=</a>)" MODIS_list.txt
    

    【讨论】:

      【解决方案3】:

      在 grepping 时,您可以连接常量字符串和变量。

      Example: 
      Dumpy:~ admin$ cat /tmp/file.txt 
      user is john
      user is pol
      user is bob
      user is mark
      user is mike
      
      Dumpy:~ admin$ export usrname='john'
      
      Dumpy:~ admin$ grep --color 'user is '$usrname /tmp/file.txt 
      user is john
      

      【讨论】:

      • 这种情况下不需要export变量。您应该在 $usrname 周围包含双引号,以允许字符串包含 shell 元字符。另请参阅 shellcheck.net 以自动诊断这些以及许多其他常见错误和反模式。
      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2021-06-21
      相关资源
      最近更新 更多