我遇到的真正问题是我的文件看起来像这样:
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
干杯!
答案 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)}'