単語間のスペースを削除し、大文字を小文字に変更して新しいファイルに転送します。

単語間のスペースを削除し、大文字を小文字に変更して新しいファイルに転送します。

1年生の時はLinuxを利用して先生が作ったゲームシェルをターミナルで学んでみました。単語間のスペースを水平に削除し(\ nを除く)、文字を大文字から小文字に変更し、結果を新しいファイルに転送するように求められました。

私はこのコマンドが大丈夫だと確信しています。一度cat newfileを使用して表示します。

これは私のコマンドです:

sed -i 's/.*/\U&/' old file | tee newfile

しかし、それは受け入れません。なぜ動作しないのですか?誰かが私が間違っていることを説明できますか?

答え1

私は少なくとも3つを見ることができます:

  1. \U修飾子の変換到着大文字に変換するように求められました。~から大文字から小文字へ

  2. あなたの式はスペースをまったく削除しないようです。これはおそらく、またはなどの別の式で実行するのが最も簡単ですs/ //g(より一般的には水平スペースを置き換えることです)。s/[[:blank:]]//g

  3. コマンドの出力を別のファイルまたはプロセスにリダイレクトまたはパイプしたい場合-i(または)を使用することは意味がありません--in-place

したがって、これらすべてをまとめると、次のようになります。

sed -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile > newfile

oldfile最初に内部変更を行ってからリダイレクトを使用してコンテンツを転送するには、少なくとも次のnewfileコマンドを使用してGNU sedでこれを実行できます。

sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' -e 'w /dev/stdout' oldfile | tee newfile

/dev/stdoutこのオプションを使用すると、デフォルトで変更されたファイルは標準出力に書き込まれないため、明示的に作成する必要があります。-i

または(より簡単に)変更されたファイルを移動またはコピーします。

sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile && cp oldfile newfile

関連情報