我正在寻找一种简单的方法来从文本中剪切键值对(其中键是唯一且指定的),就像如何cut
用于剪切 CSV 文件中的指定列一样。我正在寻找的键并不总是在行中处于相同的相对位置 - 也就是说,使用cut
后跟sed
不会起作用,因为我正在寻找的键并不总是在相同的,
分隔列中。
有问题的文本确实是 CSV,但碰巧这些值是键/值对,以=
.
例如,我可能会用以下三行解析一个文件:
Foo=1, Bar=2, Baz=3
Bar=4, Foo=2, Baz=3
Bar=42, Baz=42, Foo=3
我想剪切此文本以生成特定键的键/值对。如果我正在寻找Foo
,那么我想要的输出将是:
Foo=1
Foo=2
Foo=3
理想情况下,我想要一个具有与 类似语法的命令行工具cut
,并且可以从标准输入和文件中读取。
有这样的工具吗?
答案1
grep
可以使用-o
选项来做到这一点:
grep -o 'Foo=[^,]*' file
答案2
awk
汇总替代方案列表的解决方案:
awk -v RS=', ' -F'=' '$1=="Foo"' <file>
将每个记录视为由 分隔', '
,并将每个记录拆分为字符上的字段=
(使用-F
)。然后只需在第一个字段上进行匹配即可$1
。这里显示的建议是一个简单的字符串匹配,请随意使用正则表达式,例如$1~/\<Foo\>/
.
答案3
根据实际情况的复杂性,此sed
命令可能就足够了:
sed -n 's/^.*\(\<Foo=[^,]*\).*/\1/p'
这是有效的例子
FIELD='Foo'
sed -n "s/^.*\(\<${FIELD}=[^,]*\).*/\1/p' << xxEOFxx
Foo=1, Bar=2, Baz=3
Bar=4, Foo=2, Baz=3
Bar=42, Baz=42, Foo=3
xxEOFxx
Foo=1
Foo=2
Foo=3
答案4
如果您没有grep
可用的选项-o
,这也应该可以解决问题:
sed -e 's/, /\n/g' | grep '^Foo='
这是使用sed
换行符替换每个逗号+空格(将每个键值对分成自己的行),然后使用 grep 仅搜索“Foo”键。
测试用例:
printf "%s\n" "Foo=1, Bar=2, Baz=3" "Bar=4, Foo=2, Baz=3" "Bar=42, Baz=42, Foo=3" \
| sed -e 's/, /\n/g' | grep '^Foo='