【问题标题】:Replacing whitespace with single tab unless in double quotes - Part II除非在双引号中,否则用单个制表符替换空格 - 第二部分
【发布时间】: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!

【问题讨论】:

    标签: regex string bash awk


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,这似乎是问题所在。代码现在进行所需的替换。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多