回答:
以下を試してください:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
4つのスペースが必要な場合は、次を試してください。
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'
1行につき複数のタブを置き換える必要があります。
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
」(つまり、「+
」の代わりに「\;
」)、find
バージョンがサポートしている場合(およびサポートしていないバージョンに個人的に出会ったことがないが、POSIX標準ではない場合) 、そのため、一部のシステムで発生する可能性があります。-exec command {} +
マニュアルの「」を参照してください。代わりの1つのインスタンスを起動するとsed
、すべてのファイルに対して、これはと引数リストを構築するシステムのサポート(など、多くのファイル名引数としてgetconf ARG_MAX
だけのように私のシステム上= 2097152)、xargs
ので、起動ずっと少ないsed
プロセス。
sed
、\t
タブエスケープシーケンスを理解していません。これをリテラルのタブ文字に置き換えることができます。これは、シェルで入力できます[Ctrl]+V, [Tab]
。
これを行うには多くの方法があります。注意を怠ったり、見た目でLinuxを初めて使用する場合は、これを行いながら自分自身を撃つ方法もたくさんあります。のようなものを使用するかfind
、エディターを使用して手動で変換するファイルのリストを作成できると仮定して、そのリストを次のようにパイプします。
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
自分の足で撃つことができる1つの方法は、タイプミスをして、指定したすべてのファイル名に空のファイルをmv'ingして、すべてのファイルの内容を削除することです。したがって、バックアップした小さなファイルセットで最初に行うことを慎重にテストしてください。
mv
の成功を条件expand
:expand ... && mv ...
expand -t 4
タブを4つのスペースに展開することを忘れないでください。また、このメソッドは末尾の改行を作成できます。しかし、そうでなければ機能します。
この問題に、次の要件を念頭に置いて試してみました。
最後の要件は、「展開」では所定の場所にあるファイルを変更できないため、満たすのが最も困難でした。
私は次の解決策を思いつきました:
find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)' -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'
以下に説明を示します。
expand
、私はs / heがテキストの配置を保持することを望んでいると仮定します。