web-dev-qa-db-ja.com

ファイルの各行から先頭の空白を削除する方法

次のようなファイルがあります。

for (i = 0; i < 100; i++)
    for (i = 0; i < 100; i++)
  for (i = 0; i < 100; i++)
       for (i = 0; i < 100; i++)
     for (i = 0; i < 100; i++)
           for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)

私はそれをこのように見せたい(インデントを削除する):

for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)

どのようにこれを行うことができますか(多分sedを使用して?)?

60
Lazer
sed "s/^[ \t]*//" -i youfile

警告:これは元のファイルを上書きします。

107
shuvalov

この特定の問題では、次のようなものが機能します。

$ sed 's/^ *//g' < input.txt > output.txt

行の先頭にあるすべてのスペースを何も置き換えないでください。タブも削除する場合は、次のように変更します。

$ sed 's/^[ \t]+//g' < input.txt > output.txt

/の前の先頭の「s」は「置換」を意味します。 /は、パターンの区切り文字です。最初の2つの/の間のデータは一致するパターンであり、2番目と3番目の/の間のデータはそれを置き換えるデータです。この場合、何も置き換えません。最後のスラッシュの後の「g」は、「グローバルに」実行することを意味します。つまり、最初に一致したものだけでなく、ファイル全体に適用します。

最後に、< input.txt > output.txtの代わりに-iオプションを使用して、ファイルを「インプレース」編集することができます。つまり、結果を含めるために2番目のファイルを作成する必要はありません。このオプションを使用すると、元のファイルが失われます。

26
Bryan Oakley

AWKを使用できます:

$ awk '{$1=$1}1' file
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)

sed

$ sed 's|^[[:blank:]]*||g' file
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)

シェルのwhile/readループ

while read -r line
do
    echo $line
done <"file"
13
ghostdog74

このPerlコードは元のファイルを編集します。

Perl -i -ne 's/^\s+//;print' file

次は、元のファイルを編集する前にバックアップコピーを作成します。

Perl -i.bak -ne 's/^\s+//;print' file

Perlはsed(およびawk)から大きく借りていることに注意してください。

5
Chris Koknat

FWIW、editingこのファイルの場合、すべての行を強調表示してタブ解除ボタンを使用できます。

  • Vimでは、shift-vを使用して行を強調表示し、<<を押します
  • Macを使用している場合は、Atom、Sublimeなどを使用し、マウスで強調表示してからShiftキーを押しながらタブを押すことができます

これをコマンドラインから実行する必要があるという要件があるかどうかはわかりません。もしそうなら、:thumbs-up:受け入れられた答えに! =)

0
Ben

sed -e 's/^ [\ t] * //' name_of_file_from_which_you_want_to_remove_space> 'name _file_where_you_want_to_store_output'

e.g:- sed -e 's/^ [\ t] * //' file1.txt> output.txt

注:

s /:置換コマンド〜各アドレス行のパターンの置換(^ [\ t] *)

^ [\ t] *:検索パターン(^ –行の先頭。[\ t] *は、タブを含む1つ以上の空白スペースに一致します)

//:一致したすべてのパターンを置換(削除)します

0
zahid

どうぞ:

user@Host:~$ sed 's/^[\t ]*//g' < file-in.txt

または:

user@Host:~$ sed 's/^[\t ]*//g' < file-in.txt > file-out.txt
0
Joao da Silva