web-dev-qa-db-ja.com

複数のファイルの末尾の空白を削除する方法は?

複数のファイルの末尾の空白を削除するツール/ UNIXシングルライナーはありますかin-place

例えば。 findと組み合わせて使用​​できるもの。

58
Mikko Ohtamaa

あなたが欲しい

sed --in-place 's/[[:space:]]\+$//' file

これにより、all POSIX標準定義の空白文字が削除され、垂直タブやフォームフィードが含まれます。また、ゼロ以上のマッチャー(*)を使用する他の回答とは異なり、末尾の空白が実際に存在する場合にのみ置換を行います。

--in-placeは、単に-iの長い形式です。スクリプトで長い形式を使用することを好みます。これは、フラグが実際に行うことをよりわかりやすくする傾向があるためです。

次のようにfindと簡単に統合できます。

find . -type f -name '*.txt' -exec sed --in-place 's/[[:space:]]\+$//' {} \+

Macを使用している場合

コメントで指摘したように、gnuツールをインストールしていない場合、上記は機能しません。その場合は、次を使用できます。

find . -iname '*.txt' -type f -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} \+
127
Tim Pote

すべてがGNU sedを必要とする他のソリューションとは異なり、これはPOSIX標準コマンドを実装するすべてのUnixシステムで動作するはずです。

find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && mv /tmp/.$$ "$i";done' arg0 {} +

編集:このわずかに変更されたバージョンは、ファイルのアクセス許可を保持します。

find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && cat /tmp/.$$ > "$i";done' arg0 {} +
13
jlliagre

私は this を使用して空白を修正しました:

while IFS= read -r -d '' -u 9
do
    if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
    then
        sed -i -e 's/[ \t]\+\(\r\?\)$/\1/;$a\' -- "$REPLY"
    else
        echo "Skipping $REPLY" >&2
    fi
done 9< <(find . \( -type d -regex '^.*/\.\(git\|svn\|hg\)$' -Prune -false \) -o -type f -print0)

特徴:

  • キャリッジリターンを保持します([:space:])、したがって、Windows/DOSスタイルのファイルで正常に動作します。
  • 「通常の」空白だけを心配する-ファイルに垂直タブなどがある場合は、おそらく意図的なものです(テストコードまたは生データ)。
  • .gitおよび.svn VCSディレクトリをスキップします。
  • fileがテキストファイルであると考えるファイルのみを変更します。
  • スキップされたすべてのパスを報告します。
  • anyファイル名で動作します。
4
l0b0

これはどう:

sed -e -i 's/[ \t]*$//'

ところで、これは便利なサイトです: http://sed.sourceforge.net/sed1line.txt

1
Kylo

Sed gurus(自分自身を含む)ではない人のために、JavaScriptの正規表現を使用してファイル内のテキストを置換し、その場所で置換を行う小さなスクリプトを作成しました。

http://git.io/pofQnQ

末尾の空白を削除するには、次のように使用できます。

$ node sed.js "/^[\t ]*$/gm" "" file

楽しい

1
mendezcode

ex

Exエディター (Vimの一部)を使用してみてください:

$ ex +'bufdo!%s/\s\+$//e' -cxa *.*

注:再帰(bash4およびzsh)の場合、 新しいグロビングオプション**/*.*)を使用できます。 shopt -s globstarで有効にします。

Perl

find . -type f -name "*.Java" -exec Perl -p -i -e "s/[ \t]$//g" {} \;

Spring Framework Code Style に従って。

sed

sedを使用するには、次を確認してください。 sedで末尾の空白を削除する方法?


参照: すべてのファイルの末尾の空白を再帰的に削除する方法?

1
kenorb

何らかの理由で、sedコマンドとPerlコマンドが機能しませんでした。これは:

find ./ -type f | rename 's/ +$//g'

同様に読むのが最も簡単なもののように感じます

0
Indivision Dev