2017-08-24 128 views
1

我有一个看起来像匹配使用grep并打印匹配的模式多种模式

..<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"... 

我想从在bash文件的每一行中提取出来field1field2文件。我希望field1和field2出现在每行的同一行中。所以输出应该喜欢 -

"field1":"some-value" "field2":"some-value" 
"field1":"some-value" "field2":"some-value" 
"field1":"some-value" "field2":"some-value" 

我写了一个grep的表情像 -

grep -E '"field1":"[a-z]*".*"field2":"[a-z]*"' -o 

但由于.*之间,它产生这两个表达式之间所有的所有文本。我也试过

grep -E '"field1":"[a-z]*"|"field2":"[a-z]*"' -o 

但是,这会输出所有field1s在单独的行,然后在单独的行中输出所有field2s。

如何获得预期的输出?

回答

4

您可以使用grepawk来格式化结果:

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" 
0

使用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/'