Awk场分离器

Awk场分离器,awk,Awk,我在文件中有一组键值对,每行由“:”分隔 在阅读每一行之后,我使用awk获取键值对,如下所述 key=$(echo $LINE | awk -F " *: *" '{print $1}') value=$(echo $LINE | awk -F " *: *" '{print $2}') 问题是,如果值本身包含“:”,它将被进一步拆分,我将只读取“:”之前的值 如何读取整个值如果文件包含被解释为分隔符符号的字符,则需要用其他字符替换这些字符或选择其他分隔符 如果您只想在第一个:上拆分,那么

我在文件中有一组键值对,每行由“:”分隔

在阅读每一行之后,我使用awk获取键值对,如下所述

key=$(echo $LINE |  awk -F " *: *" '{print $1}')
value=$(echo $LINE |  awk -F " *: *" '{print $2}')
问题是,如果值本身包含“:”,它将被进一步拆分,我将只读取“:”之前的值


如何读取整个值

如果文件包含被解释为分隔符符号的字符,则需要用其他字符替换这些字符或选择其他分隔符

如果您只想在第一个
上拆分,那么使用
bash
字符串操作将更容易:

key=${LINE%%:*}
value=${LINE#*:}
%%
从字符串后面删除与其正则表达式匹配的最长字符串(
:*
),然后
#
删除与字符串前面匹配的最短字符串。 e、 g


好的,因为您的shell没有这个,所以可以使用
sed

key=$(echo "$LINE" | sed 's/:.*$//')
value=$(echo "$LINE" | sed 's/[^:]*://')
第一个查找并删除冒号和行尾之间的所有内容,由于(大多数,包括
sed
的)正则表达式默认为贪婪的,因此从第一个冒号开始就是贪婪的。第二个将删除第一个冒号之前的所有内容。

如果字段包含分隔符,则总是会遇到问题。如果您知道某个特定字段始终包含分隔符,您可以想出一种解决方法,首先用
sed
替换该字段:

echo $LINE | sed 's/:/|/3' | awk ...

在上面的示例中,如果您知道一行中第三次出现的
总是在某个字段中,那么您可以将其替换为
|
或类似的内容。但这只是解决方案的一个技巧;真正的答案是,如果可能的话,更改您的分隔符,或者编写代码对其进行解析,以考虑诸如转义之类的内容(例如,
\:
)。

回答一个旧问题,但使用cut将使这一点变得非常简单:

key=$(echo $LINE | cut -d: -f1)
value=$(echo $LINE | cut -d: -f2-)

-f2-表示字段2,直到结束

或者您可以将其全部保留在awk中,将有问题的字段设为临时变量,并
拆分(tmpVar,tmpArr,“:”);myVal=tmpArr[1];myVal2=tmpArr[2]。祝大家好运。考虑将样本输入和预期输出添加到发布中。这将有助于大大减少猜测工作。祝你好运。这在我的系统中不受支持shell@siri好的,在
sed
中添加了一种方法。
key=$(echo $LINE | cut -d: -f1)
value=$(echo $LINE | cut -d: -f2-)