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
代替コマンドにこのフラグと番号を使用できます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.