考虑以下文字:
abc/xyz-ibl.txt-234- "simple", /* col */
如何使用正则表达式从上述文本中提取xyz-ibl.txt
和simple
。文件名可以是任何内容,但它始终具有.txt
的扩展名,simple
也可以是任何内容,但始终后跟, /* col */
。
答案 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
使用-F
,OFS
然后通过管道转换为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]); }'