grep命令中的变量

时间:2018-03-05 13:40:14

标签: bash grep pattern-matching

我想从文本文件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>)'

3 个答案:

答案 0 :(得分:2)

尽管如此,我建议你不要使用怪物正则表达式,而是将你的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()"

答案 1 :(得分:1)

在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

答案 2 :(得分:1)

您要执行的命令是:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<div>grab me and drag over the table</div>
<table>
  <tr>
    <td>11111111111111111111111</td>
  </tr>
  <tr>
    <td>222222222222222222222</td>
  </tr>
  <tr>
    <td>333333333333333333333</td>
  </tr>
  <tr>
    <td>11111111111111111111111</td>
  </tr>
  <tr>
    <td>222222222222222222222</td>
  </tr>
  <tr>
    <td>333333333333333333333</td>
  </tr>
</table>

正如wolfrevokcats所说(但你需要知道他们在说什么),你必须将单引号改为双引号。问题是你在字符串 hdf 之后有一个引号,它必须被转义两次:一次用于 shell ,一次用于 grep ,但你又需要知道我在说什么。另一个解决方案可以避免在&#39; hdf&#39;右侧的报价转义问题。是使用&#39;。&#39;如下:

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