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.