帖子“Replacing whitespace with single tab unless in double quotes”讨论了 awk 代码,其中字符串外部双引号中的所有空格都被单个制表符替换。发布了两个可以正确执行替换的答案 - ,除非输入字符串中存在特定数字或非字母字符组合。
有没有人知道是什么阻止命令进行所需的替换以及如何克服它?
> cat file
# foo bar Name product "baz qux" # Non-letter chars: none
# foo_bar . Name=foo;product="baz qux" # Non-letter chars: underscore, dot, equal sign, semicolon
# foo-bar + Name=foo,product="baz qux" # Non-letter chars: dash, plus, equal sign, comma, mult. whitespaces
所需的输出(通过管道传送到cat -A
时):
# foo^Ibar^IName^Iproduct^I"baz qux"$
# foo_bar^I.^IName=foo;product="baz qux"$
# foo-bar^I+^IName=foo,product="baz qux"$
实际输出(通过管道传送到cat -A
时):
> awk -v FPAT='"[^"]*"|[^[:blank:]]+' -v OFS='\t' '{$1=$1} 1' file | cat -A
# foo^Ibar^IName^Iproduct^I"baz qux"$
# foo_bar^I.^IName=foo;product="baz^Iqux"$ # sic!
# foo-bar^I+^IName=foo,product="baz^Iqux"$ # sic!
> awk '{$1=$1}1' OFS='\t' FPAT='"[^"]+"|[^ ]+' file | cat -A
# foo^Ibar^IName^Iproduct^I"baz qux"$
# foo_bar^I.^IName=foo;product="baz^Iqux"$ # sic!
# foo-bar^I+^IName=foo,product="baz^Iqux"$ # sic!
答案 0 :(得分:1)
它与特殊字符无关,将FPAT更改为:
FPAT='("[^"]*"|[^[:blank:]"]+)+'
问题是字段可能包含引号和之间的字符串,如Name=foo;product="baz qux"
之类的引号之外的其他非空格字符。旧模式并没有描述这些领域。