我在每行由“:”
分隔的文件中有一组键值对我在阅读每一行后使用awk获取键值对,如下所述
key=$(echo $LINE | awk -F " *: *" '{print $1}')
value=$(echo $LINE | awk -F " *: *" '{print $2}')
问题在于,如果值本身包含“:”,则进一步拆分,我将最终只读取“:”之前的值。
如何阅读整个值
答案 0 :(得分:3)
如果你只想分开第一个:
,那么使用bash
字符串操作会更容易:
key=${LINE%%:*}
value=${LINE#*:}
%%
从字符串后面删除与其正则表达式(:*
)匹配的最长字符串,#
删除在字符串前面匹配的最短字符串。
e.g。
$ LINE="a:b:c"
$ key=${LINE%%:*}
$ value=${LINE#*:}
$ echo $key
a
$ echo $value
b:c
好的,既然你的shell没有这个,你可以使用sed
:
key=$(echo "$LINE" | sed 's/:.*$//')
value=$(echo "$LINE" | sed 's/[^:]*://')
第一个查找并删除冒号和行尾之间的所有内容,因为(大多数,包括sed
的)正则表达式默认是贪婪的,这将是第一个冒号的所有内容。第二个删除所有内容,包括第一个冒号。
答案 1 :(得分:1)
如果某个字段包含您的分隔符,那么总是会遇到问题。如果您知道特定字段始终包含分隔符,则可以首先使用sed
替换该事件:
echo $LINE | sed 's/:/|/3' | awk ...
在上面的示例中,如果您知道某一行中第三次出现:
总是并且在某个字段内,那么您可以将其替换为|
或类似的东西。但这只是一个解决方案的黑客;真正的答案是在可能的情况下更改分隔符,或编写解析它的代码,以考虑类似转义的内容(例如\:
)。
答案 2 :(得分:1)
回答一个老问题,但使用cut会使这很简单:
key=$(echo $LINE | cut -d: -f1)
value=$(echo $LINE | cut -d: -f2-)
-f2-表示字段2直到结束
答案 3 :(得分:0)
如果您的文件包含被解释为分隔符号的字符,那么您将需要用其他字符替换这些字符或选择不同的分隔符。