我想从文本文件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>)'
您要执行的命令是:
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
尽管如此,我建议您将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()"
在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