我有一个看起来像
的文件..<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中从文件的每一行中提取field1
和field2
。我希望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
但是这会在单独的行中输出所有field1,然后在单独的行中输出所有field2。
如何获得预期的输出?
答案 0 :(得分:4)
您可以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"
答案 1 :(得分: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/'