使用grep或awk进行模式匹配

使用grep或awk进行模式匹配,awk,grep,Awk,Grep,考虑到以下一行案文: abc/xyz-ibl.txt-234- "simple", /* col */ 如何使用正则表达式从上述文本中提取xyz ibl.txt和simple。文件名可以是任何内容,但它的扩展名总是.txt,simple也可以是任何内容,但后面总是跟着,/*col*/,这将获得文件名: grep -oP "\b[^/]*\.txt" 这将使您变得简单: grep -oP '(?<=")[^"]*(?="\s*,\s*/\*\s*col\s*\*/)' 注意:-p用

考虑到以下一行案文:

abc/xyz-ibl.txt-234-   "simple", /* col */

如何使用正则表达式从上述文本中提取
xyz ibl.txt
simple
。文件名可以是任何内容,但它的扩展名总是
.txt
simple
也可以是任何内容,但后面总是跟着
,/*col*/
,这将获得文件名:

grep -oP "\b[^/]*\.txt"
这将使您变得
简单

grep -oP '(?<=")[^"]*(?="\s*,\s*/\*\s*col\s*\*/)'
注意:
-p
用于Perl正则表达式

编辑:

根据您的评论,如果您想在只有两个匹配时提取它们,那么最好使用
sed
而不是
grep

sed
与扩展正则表达式一起使用:

echo "$s" |sed -nr 's#.*/(\b[^/]+\.txt).*"([^"]*)*"\s*,\s*/\*\s*col\s*\*/#\1\n\2#p'
使用基本正则表达式:

echo "$s" |sed -n 's#.*/\([^/]*\.txt\).*"\([^"]*\)*"[[:space:]]*,[[:space:]]*/\*[[:space:]]*col[[:space:]]*\*/#\1\n\2#p'

若要仅返回包含
.txt
字符串,请使用
awk
-F
OFS
,然后管道到
grep
反转:

awk -F'/|.txt|"' 'BEGIN { OFS = ".txt" } { print $2," "$4} | grep -v ','
结果:

xyz-ibl.txt simple

下面是一个使用awk的解决方案

awk '{ match ($0, /\/([^.]+)(.txt)-.*"([^"]+)"/, fields); printf("%s%s %s\n", fields[1], fields[2], fields[3]); }'

结尾不考虑C风格的注释。下面是一个例子

awk '{ match ($0, /\/([^.]+)(.txt)-.*"([^"]+)", \/\* col \*\//, fields); printf("%s%s %s\n", fields[1], fields[2], fields[3]); }'

难道不能将这两个正则表达式合并为一个吗?它可以工作,但仍然像OR一样工作。有没有可能使它像两个表达式必须同时匹配的地方一样工作。@Shahzad那么grep将不是一个明智的选择。。添加了sed解决方案即使没有匹配项,它也会打印.txt。事实上,输入来自另一个grep,需要进一步分析。这意味着有几行不包含此模式。
xyz-ibl.txt simple
awk '{ match ($0, /\/([^.]+)(.txt)-.*"([^"]+)"/, fields); printf("%s%s %s\n", fields[1], fields[2], fields[3]); }'
awk '{ match ($0, /\/([^.]+)(.txt)-.*"([^"]+)", \/\* col \*\//, fields); printf("%s%s %s\n", fields[1], fields[2], fields[3]); }'