grep命令中的变量

问题描述 投票:1回答:3

我想从文本文件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>)'
bash grep pattern-matching
3个回答
1
投票

您要执行的命令是:

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

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
投票

在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
© www.soinside.com 2019 - 2024. All rights reserved.