![如何删除单词之间的多个空格?](https://linux22.com/image/227554/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E5%8D%95%E8%AF%8D%E4%B9%8B%E9%97%B4%E7%9A%84%E5%A4%9A%E4%B8%AA%E7%A9%BA%E6%A0%BC%EF%BC%9F.png)
grep include /etc/nginx/nginx.conf
输出:
include /etc/nginx/modules-enabled/*.conf;
include mime.types;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
期望的输出:
include /etc/nginx/modules-enabled/*.conf;
include mime.types;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
答案1
awk '/include/ {$1 = $1; print}' < your-file
会那么做。
通过将某些内容分配给$1
,强制awk
通过将字段(默认情况下由空格分隔(至少是空格和制表符,可能其他取决于语言环境和 awk 实现))与OFS
(默认情况下为空格)来重建记录。
等价sed
的:
sed -E '/include/!d; s/[[:space:]]+/ /g; s/^ //; s/ $//' < your-file
[[:space:]]
[[:blank:]]
其中至少包括空格和制表符;[[:space:]]
还包括垂直间距字符 1,如果文件具有 MSDOS CRLF 行结尾,这在这里可能很有用,因为它会删除行末尾的那些虚假 CR。
1 例如垂直制表符、换页符(不应出现在输入中)、换行符、行分隔符(不会出现在记录awk
进程中awk
)内容每个线反过来
答案2
使用 sed 应该可以简单地做到这一点:
% sed -e 's/^ *//g' -e 's/ */ /g' file.txt
include /etc/nginx/modules-enabled/*.conf;
include mime.types;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
s/pattern/replacement/
进行查找和替换,^
意味着行的开头,*
任意数量的空格,并且*
只是一个空格后跟任意数量的空格。最后的g
代表“全局”,即替换所有匹配项。
[[:space:]]
如果那里还有选项卡,请将空格替换为:
% sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]][[:space:]]*/ /g' file.txt
答案3
如果你可以使用 Perl:
#!/usr/bin/perl
use v5.30;
use warnings;
while (<DATA>){
$_ =~ s/[[:blank:]]/ /g; #replace any number of subsequent space with single space except newline
$_ =~ s/\s//; #remove single space at the beginning of each line
print("$_");
}
__DATA__
include /etc/nginx/modules-enabled/*.conf;
include mime.types;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
如果您想从命令行尝试单行版本:
perl -nE '{$_ =~ s/[[:blank:]]+/ /g; $_ =~s/^\s//; print $_}' file.txt
答案4
grep include /etc/nginx/nginx.conf | awk -F ' ' '{print $2}' | sort | uniq