1年生の時はLinuxを利用して先生が作ったゲームシェルをターミナルで学んでみました。単語間のスペースを水平に削除し(\ nを除く)、文字を大文字から小文字に変更し、結果を新しいファイルに転送するように求められました。
私はこのコマンドが大丈夫だと確信しています。一度cat newfileを使用して表示します。
これは私のコマンドです:
sed -i 's/.*/\U&/' old file | tee newfile
しかし、それは受け入れません。なぜ動作しないのですか?誰かが私が間違っていることを説明できますか?
答え1
私は少なくとも3つを見ることができます:
\U
修飾子の変換到着大文字に変換するように求められました。~から大文字から小文字へあなたの式はスペースをまったく削除しないようです。これはおそらく、またはなどの別の式で実行するのが最も簡単です
s/ //g
(より一般的には水平スペースを置き換えることです)。s/[[:blank:]]//g
コマンドの出力を別のファイルまたはプロセスにリダイレクトまたはパイプしたい場合
-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