Bash 删除字符串中单引号后的空格(使用awk或sed)

Bash 删除字符串中单引号后的空格(使用awk或sed),bash,awk,sed,Bash,Awk,Sed,以下是输入文件: 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?对于gawk,您可以使用gensub: $ cat q.txt select a, b,c, a1 as ' value1 '

以下是输入文件:

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?

对于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;

通过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;

我很难使用sed,因为basic和扩展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

我很难使用sed,因为basic和扩展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

您的示例和描述不匹配。您所需的输出中删除的空格比引号中的要多。@user161778:我只考虑带引号的字符串…忽略其他空格..当我运行第一个脚本时,我遇到了错误..当我删除引号之间的空格时…查询运行得非常好..不知道确切的原因您为此尝试了什么吗?如果是的话,展示一下你的尝试。如果没有,请先这样做。您的示例和描述不匹配。您所需的输出中删除的空格比引号中的要多。@user161778:我只考虑带引号的字符串…忽略其他空格..当我运行第一个脚本时,我遇到了错误..当我删除引号之间的空格时…查询运行得非常好..不知道确切的原因您为此尝试了什么吗?如果是的话,展示一下你的尝试。如果不是,请先这样做。如果在尾随引号之前的值后面有多个空格(例如,
'value……。
,其中点是空格),则子表达式将包括除最后一个空格以外的所有空格。是的,这是真的,因此尾随的
+
是多余的。尝试避免这种情况的一个明显方法是在括号表达式中包含空格,但如果
value[N]
可能包含空格,则该方法将失败。我们将不得不等待OP告诉我们他们的输入是否与他们发布的内容不完全匹配。非常好。我同意---由OP决定需要解决的各种可能的输入案例(他或她可能已经做了)。如果在尾随引号之前的值后面有多个空格(例如,
“value…”。
,其中点是空格)子表达式将包含除最后一个空格以外的所有空格。是的,这是正确的,因此尾部的
+
是多余的。尝试避免这种情况的一个明显方法是在括号表达式中包含空格,但如果
value[N]
可能包含空格,则该方法将失败。我们将不得不等待OP告诉我们他们的输入是否与他们发布的内容不完全匹配。非常好。我同意——这取决于OP提出需要解决的各种可能的输入案例(他或她可能已经做了)。