awk 删除第一个字母后的多余空格?

awk 删除第一个字母后的多余空格?

awk 删除第一个字母后的多余空格?

我们的文件包含:

Blue    sky.    Nice       weather.
    White cloud.    Bright    sun.
        Cool air. Bla    bla          bla.

如何获得这样的内容:

Blue sky. Nice weather.
    White cloud. Bright sun.
        Cool air. Bla bla bla.

此命令awk '{$1=$1} 1' file删除所有多余的空格。
但我们只需要删除第一个字母后的多余空格即可。

有人知道吗?
我们感谢您的关注!

答案1

如果您运行的是 Linux 并拥有 GNU Sed,则可以g在 ubstitute 命令中使用该标志和数字s

sed -r 's/ +/ /g2' file.txt

去引用info sed

 Note: the POSIX standard does not specify what should happen when
 you mix the `g' and NUMBER modifiers, and currently there is no
 widely agreed upon meaning across `sed' implementations.  For GNU
 `sed', the interaction is defined to be: ignore matches before the
 NUMBERth, and then match and replace all matches from the NUMBERth
 on.

但由于在某种情况下您确实希望在空格的第一个实例上进行替换(当没有前导空格时),完整的答案(使用 GNU Sed)是:

sed -r 's/^/ /;s/ +/ /g2;s/^ //' file.txt

换句话说,向所有行添加前导空格,然后“挤压”除第一个空格之外的所有连续空格实例,然后删除添加的前导空格。


如果前导空格始终是 8 的倍数,那么您可以使用以下 POSIX 兼容命令:

unexpand file.txt | sed 's/  */ /g' | expand

或者更简单地说:

unexpand file.txt | tr -s ' ' | expand

答案2

使用 GNU awk 您可以执行以下操作:

awk '{match($0,/(^[ ]+)/,arr)}; {$1=$1;printf("%s%s\n", arr[1], $0)}' 

match($0, /(^[ ]+)/, arr)捕获行前导空格。
$1=$1删除所有前导和重复空格。
printf("%s%s\n", a[1], $0)}重新添加前导空格并打印。

答案3

awk我认为这是一种 KISS 方式:

{tmp = substr($0,1,match($0,/[^ \t]/)-1); $1=$1; print tmp""$0}

前任。

$ awk '{tmp = substr($0,1,match($0,/[^ \t]/)-1); $1=$1; print tmp""$0}' file
Blue sky. Nice weather.
    White cloud. Bright sun.
        Cool air. Bla bla bla.

相关内容