如何使用awk分隔由等号分隔的两列文件?

时间:2015-02-20 13:59:33

标签: regex bash awk sed

我遇到的真正问题是我的文件看起来像这样:

username=password

我知道我可以使用-F =,但是如果第二列可能包含等号,我该怎么办?

name=laskjf9w8u23;oi4==

目前我的代码是砍掉最后一个等号。而且我只能假设,如果该字符串中早先有一个等号,它也会被切断。

以下是我目前的情况:

cat file.txt | grep "=" | sed 's/\//\\\//g' | awk --field-separator "=" --assign file="<outfile>" '{printf "\"s/@%s@/", $1 ; for (i = 2; i <= NF; i++) { printf "%s", $i ; if ($i != $NF) printf "=" } ;  printf "/g\" %s\n", file; }' | xargs -n2 sed -i

干杯!

5 个答案:

答案 0 :(得分:3)

你真的必须使用awk吗?进行此类分离的最简单方法是cut

echo "name=laskjf9w8u23;oi4==" | cut -d= -f2-
laskjf9w8u23;oi4==

请注意-f2-。这意味着抓住倒数第二组,所以你最终只会得到laskjf9w8u23;oi4。它也将处理后者的等号。

-d==设置为分隔符。

答案 1 :(得分:1)

通过sed,

$ echo 'name=laskjf9w8u23;oi4==' | sed 's/^[^=]*=//'
laskjf9w8u23;oi4==

^匹配行的开头和[^=]*否定的字符类,它匹配任何字符但不匹配=,零次或多次。用空字符串替换匹配的字符将为您提供所需的输出。

答案 2 :(得分:1)

@IgorHatarist有正确的解决方案(https://stackoverflow.com/a/28630815/1745001),如果您只想在第一个=符号后打印文本,但只是为了完整性,如果您需要做更多的事情:< / p>

$ echo "name=laskjf9w8u23;oi4==" |
awk '{f1=f2=$0; sub(/=.*/,"",f1); sub(/[^=]+=/,"",f2); print "<" f1 ">:<" f2 ">"}'
<name>:<laskjf9w8u23;oi4==>

答案 3 :(得分:0)

您可以使用grep as

执行此操作
$ echo "name=laskjf9w8u23;oi4==" | grep -oP '=\K.*'
laskjf9w8u23;oi4==

OR

使用sed作为

$ echo "name=laskjf9w8u23;oi4==" | sed -r 's/[^=]*=//'
laskjf9w8u23;oi4==

答案 4 :(得分:0)

我可能会使用cut来解决这个简单的问题,但是如果你真的想使用awk(也许是因为真正的问题更复杂并且需要awk),那么这是怎么回事:

awk '{print substr($0,index($0,"=")+1)}'

这将打印第一个=之后的每个输入行的内容,如果它不包含=,则打印整行。 (这是因为index如果找不到搜索字符串则返回0,因此在这种情况下,子字符串从0+1开始,而awk字符串索引从1开始。 )

如果你想在没有=的情况下不打印任何内容,那么你可以使用它:

awk '/=/{print substr($0,index($0,"=")+1)}'

或者,如果您想确保该行包含有效的标识符,后跟=,如下所示:

awk '/^[[:alpha:]_][[:alnum:]_]*=/{print substr($0,index($0,"=")+1)}'