如何用一个毛坯替换多个毛坯,并使用awk快速保持所有毛坯的开头和结尾不变?

如何用一个毛坯替换多个毛坯,并使用awk快速保持所有毛坯的开头和结尾不变?,awk,Awk,输入字符串 " x1 x2 x3 x4 " 预期字符串 " x1 x2 x3 x4 " 用一个毛坯替换多个毛坯,并用awk保留所有毛坯的开头和结尾 这是我的尝试 echo " x1 x2 x3 x4 " |awk 'BEGIN{FS=" "}{$1=$1;print $0}' 所有多个空格都用一个空格重新拼凑,但开头和结尾的所有空格也被删除。 如何使用awk快速转换字符串? 1.用一块坯料替换多块坯料 2.在开头和结尾

输入字符串

"   x1    x2    x3       x4   "
预期字符串

"   x1 x2 x3 x4   "
用一个毛坯替换多个毛坯,并用awk保留所有毛坯的开头和结尾

这是我的尝试

echo "   x1    x2    x3       x4   " |awk 'BEGIN{FS=" "}{$1=$1;print $0}'
所有多个空格都用一个空格重新拼凑,但开头和结尾的所有空格也被删除。
如何使用awk快速转换字符串?
1.用一块坯料替换多块坯料
2.在开头和结尾保留所有空格

sed的/\b+\b//g'可以做到这一点

echo "   x1    x2    x3       x4   " | sed 's/\b \+\b/ /g'
说清楚

echo "|$(echo "   x1    x2    x3       x4   " | sed 's/\b \+\b/ /g')|"
|   x1 x2 x3 x4   |
reg表达式/\b+\b/不能在awk中使用

echo "   x1    x2    x3       x4   " | awk '{gsub(/\b \+\b/," ");print}'
echo "   x1    x2    x3       x4   " | awk '{gsub(/\b +\b/," ");print}'
@尝试:

稍后还会添加代码解释

编辑:

awk '{
        match($0,/^\" +/);              #### Using match keyword for finding the starting " till first space.
        val1=substr($0,RSTART,RLENGTH); #### creating val1 variable and saving that above match's value into it(where RSTART and RLENGTH are awk's default variable which will be set only when a match is found.)
        match($0,/ +\"$/);              #### Using match keyword for finding the space till string " end of the line.
        val2=substr($0,RSTART,RLENGTH); #### creating val2 variable and saving that above match's value into it(where RSTART and RLENGTH are awk's default variable which will be set only when a match is found.)
        gsub(/[[:space:]]+/,FS);        #### global substitution of space for whole spaces with a single space in complete record/line.
        gsub(/\" /,val1);               #### Now substituting the match of starting with " till space with variable val1.
        gsub(/ \"$/,val2);              #### Now substituting the match of starting with " till space with variable val2.
        print                           #### print the current line.
     }
    '  Input_file                       #### Mentioning Input_file here.

我们只需要使用正确的标识符:

echo "|$(echo "   x1    x2    x3       x4   " | awk 'gsub(/\y +\y/," ")')|"
我加入了额外的回音,只是为了显示grail的答案还有额外的空格

sudo apt-get install gawk
echo "   x1    x2    x3       x4   " | awk 'gsub(/\y +\y/," ")'
用下面的内容让它更清楚

echo "|$(echo "   x1    x2    x3       x4   " | awk 'gsub(/\y +\y/," ")')|"

记住<代码> \y/<代码>代码> GAWK < /C>特定构造,<代码> ++/<代码>在开始和结束时添加正确的方法是在开始和结束时使空白更清楚。我注意到了这一点。它不需要使用**匹配($ 0,/^)+/*;**,原始输入是回声“x1 x2 x3 x4”,而不是回音“x1 x2 x3 x4”,**匹配($ 0,/^+)。;**不需要使用**匹配($0,/^\“+/);**,原语输入是echo“x1 x2 x3 x4”而不是echo“x1 x2 x3 x4”**匹配($0,/^+/);**可以。
echo "|$(echo "   x1    x2    x3       x4   " | awk 'gsub(/\y +\y/," ")')|"