【发布时间】:2016-03-17 20:05:29
【问题描述】:
帖子“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!
【问题讨论】: