67

複数のファイルの末尾の空白をインプレースで削除するツール/UNIXシングルライナーはありますか。

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

4

7 に答える 7

152

あなたがしたい

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

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

--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,\}$//' {} \+
于 2012-05-22T22:51:29.800 に答える
14

すべて 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 {} +
于 2012-05-23T06:05:05.333 に答える
4

これを使用して空白を修正しました:

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テキスト ファイルと思われるファイルのみを変更します。
  • スキップされたすべてのパスを報告します。
  • 任意のファイル名で動作します。
于 2012-05-23T12:35:19.563 に答える
2

これはどう:

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

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

于 2012-05-22T22:33:08.193 に答える
1

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

http://git.io/pofQnQ

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

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

楽しみ

于 2014-07-26T02:51:51.087 に答える
1

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 で末尾の空白を削除するには?


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

于 2015-04-20T12:29:29.570 に答える
0

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

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

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

于 2016-09-24T07:43:18.123 に答える