Bash 使用grep匹配多个图案并仅打印匹配的图案
我有一个文件看起来像Bash 使用grep匹配多个图案并仅打印匹配的图案,bash,shell,Bash,Shell,我有一个文件看起来像 ..<long-text>..."field1":"some-value"...<long-text>...."field2":"some-value"... ..<long-text>..."field1":"some-value"...<long-text>...."field2":"some-value"... ..<long-text>..."field1":"some-value"...<long-
..<long-text>..."field1":"some-value"...<long-text>...."field2":"some-value"...
..<long-text>..."field1":"some-value"...<long-text>...."field2":"some-value"...
..<long-text>..."field1":"some-value"...<long-text>...."field2":"some-value"...
我写了一个grep表达式,比如-
grep -E '"field1":"[a-z]*".*"field2":"[a-z]*"' -o
但是由于*
介于两者之间,它会生成这两个表达式之间的所有文本。我也试过了
grep -E '"field1":"[a-z]*"|"field2":"[a-z]*"' -o
但这会在单独的行中输出所有字段1,然后在单独的行中输出所有字段2
如何获得预期的输出?使用sed
:
echo abcdef | sed 's/\(.\).*\(.\)/\1\2/'
# yields: af
针对您的情况:
sed 's/.*\("field1":"[a-z]*"\).*\("field2":"[a-z]*"\).*/\1 \2/' yourfile
如果某些行完全不匹配,则首先执行grep
,例如
grep -Eo '"field1":"[a-z]*".*"field2":"[a-z]*"' yourfile |
sed 's/.*\("field1":"[a-z]*"\).*\("field2":"[a-z]*"\).*/\1 \2/'
您可以使用
grep
和awk
格式化结果:
grep -oE '"(field1|field2)":"[^"]*"' file | awk 'NR%2{p=$0; next} {print p, $0}'
"field1":"some-value" "field2":"some-value"
"field1":"some-value" "field2":"some-value"
"field1":"some-value" "field2":"some-value"
grep -oE '"(field1|field2)":"[^"]*"' file | awk 'NR%2{p=$0; next} {print p, $0}'
"field1":"some-value" "field2":"some-value"
"field1":"some-value" "field2":"some-value"
"field1":"some-value" "field2":"some-value"