単語間の複数のスペースを削除する方法は?

単語間の複数のスペースを削除する方法は?
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

そうします。

(デフォルトでは空白)を使用して、空白(デフォルトでは空白)で区切られた項目(最小の空白とタブ、ロケール、およびawkの実装によって異なる項目)を割り当てて、レコードを強制的に再構成$1します。awkOFS

同等sed

sed -E '/include/!d; s/[[:space:]]+/ /g; s/^ //; s/ $//' < your-file

[[:space:]][[:blank:]]これには、少なくともスペースとタブが含まれます。[[:space:]]また、縦間隔文字1も含まれます。これは、ファイルにMSDOS CRLF行末がある場合、行末の偽のCRを削除するため、ここで役に立ちます。


awk1例:垂直タブ、フォームフィード(入力には表示されない)、改行、行区切り(ロギングプロセスには表示されません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/*;

コマンドラインで1行バージョンを試すには:

perl -nE '{$_ =~ s/[[:blank:]]+/ /g; $_ =~s/^\s//; print $_}' file.txt

答え4

grep include /etc/nginx/nginx.conf | awk -F ' ' '{print $2}' | sort | uniq

関連情報