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"