考虑到以下一行案文:
abc/xyz-ibl.txt-234- "simple", /* col */如何使用正则表达式从上述文本中提取xyz-ibl.txt和simple。文件名可以是任何东西,但是它总是有.txt的扩展,simple也可以是任何东西,但是后面总是有, /* col */。
发布于 2015-07-12 06:22:02
这将为您获得文件名:
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'使用基本正则表达式:
echo "$s" |sed -n 's#.*/\([^/]*\.txt\).*"\([^"]*\)*"[[:space:]]*,[[:space:]]*/\*[[:space:]]*col[[:space:]]*\*/#\1\n\2#p'发布于 2015-07-12 06:25:17
若要返回仅包含的字符串,请将awk与-F一起使用,然后将OFS传递到grep反转:
awk -F'/|.txt|"' 'BEGIN { OFS = ".txt" } { print $2," "$4} | grep -v ','结果:
xyz-ibl.txt simple发布于 2015-07-12 07:57:08
以下是使用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]); }'https://stackoverflow.com/questions/31364844
复制相似问题