用单引号替换空格,除非用双引号括起来 - 第二部分

时间:2015-12-11 19:54:41

标签: regex string bash awk

帖子“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!

1 个答案:

答案 0 :(得分:1)

它与特殊字符无关,将FPAT更改为:

FPAT='("[^"]*"|[^[:blank:]"]+)+'

问题是字段可能包含引号之间的字符串,如Name=foo;product="baz qux"之类的引号之外的其他非空格字符。旧模式并没有描述这些领域。