使用grep或awk进行模式匹配

时间:2015-07-12 05:56:05

标签: awk grep

考虑以下文字:

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

如何使用正则表达式从上述文本中提取xyz-ibl.txtsimple。文件名可以是任何内容,但它始终具有.txt的扩展名,simple也可以是任何内容,但始终后跟, /* col */

3 个答案:

答案 0 :(得分:1)

这将为您提供文件名:

grep -oP "\b[^/]*\.txt"

这会让你simple

grep -oP '(?<=")[^"]*(?="\s*,\s*/\*\s*col\s*\*/)'

这将使你们两个:

grep -oP '\b[^/]*\.txt|(?<=")[^"]*(?="\s*,\s*/\*\s*col\s*\*/)'

示例:

s='abc/xyz-ibl.txt-234-   "simple", /* col */'
echo "$s" |grep -oP "\b[^/]*\.txt"
echo "$s" |grep -oP '(?<=")[^"]*(?="\s*,\s*/\*\s*col\s*\*/)'

输出:

xyz-ibl.txt
simple

注意:-P适用于Perl正则表达式。

编辑:

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

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

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

使用Basic regex:

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

答案 1 :(得分:0)

要返回包含.txt字符串,请awk使用-FOFS然后通过管道转换为grep反转:

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

<强>结果:

xyz-ibl.txt simple

答案 2 :(得分:0)

这是使用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]); }'