剪切键值对

剪切键值对

我正在寻找一种简单的方法来从文本中剪切键值对(其中键是唯一且指定的),就像如何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='

相关内容