【问题标题】:remove blank space after single quotes in a string (using awk or sed)删除字符串中单引号后的空格(使用 awk 或 sed)
【发布时间】:2016-04-14 00:57:16
【问题描述】:

下面是输入文件:

select a, b,c, a1 as ' value1 ', a2 as ' value2 ', d from table1;

给定的文件可以有任意数量的别名。我想删除引号之间的空格。 所需的输出是:

select a,b,c, a1 as 'value1', a2 as 'value2',d from table1;

是否可以使用 awk 或 sed?

【问题讨论】:

  • 您的示例和您的描述不匹配。您想要的输出比引号中的空格要多。
  • @user161778: 我只考虑带引号的字符串...忽略其他空格..当我运行第一个脚本时我收到错误...当我删除引号之间的空格...查询运行良好..不知道确切原因
  • 你有没有为此尝试过?如果是这样,请显示您尝试过的内容。如果没有,请先这样做。

标签: bash awk sed


【解决方案1】:

使用 gawk 你可以使用gensub:

$ cat q.txt
select a, b,c, a1 as ' value1 ', a2 as ' value2 ', d from table1;

$ cat q.awk
{ print gensub(/' *([^' ]+) *'/, "'\\1'", "g") }

$ gawk -f q.awk q.txt
select a, b,c, a1 as 'value1', a2 as 'value2', d from table1;

【讨论】:

    【解决方案2】:
    $ sed -r "s/' +([^']*) +'/'\1'/g" file
    select a, b,c, a1 as 'value1', a2 as 'value2', d from table1;
    

    【讨论】:

    • 如果在尾引号之前的值后面有多个空格(例如,' value........',其中的点是空格),则子表达式将包含除最后一个空格之外的所有空格。
    • 是的,这是真的,所以尾随 + 是多余的。避免这种情况的明显方法是在括号表达式中包含一个空格,但如果value[N] 可以包含空格,它就会失败。我们将不得不等待 OP 告诉我们他们的输入是否与他们发布的实际外观不完全匹配。
    • 好点。我同意 --- 由 OP 决定需要解决的各种可能的输入案例(他或她很可能已经这样做了)。
    【解决方案3】:

    我很难使用 sed,因为基本和扩展 Posix/GNU 都不能识别非贪婪量词 ?。无论如何,如果你可以使用 perl,这里有一种方法:

    perl -pe "s/'\s*(.*?)\s*'/'\1'/g" input_file.txt
    

     

    编辑:

    啊,是的,我喜欢@edmorton 给出的解决方案。您可以使用[^'*] 代替贪婪量词?。所以要使用 sed 你可以这样做:

    sed -r "s/'\s+([^']*)\s+'/'\1'/g" input_file.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-21
      • 2021-12-12
      • 2019-11-11
      • 2011-09-16
      • 2018-09-22
      • 2019-10-20
      • 1970-01-01
      • 2019-04-01
      相关资源
      最近更新 更多