複数のファイルの末尾の空白をインプレースで削除するツール/UNIXシングルライナーはありますか。
たとえば、 findと組み合わせて使用できるもの。
複数のファイルの末尾の空白をインプレースで削除するツール/UNIXシングルライナーはありますか。
たとえば、 findと組み合わせて使用できるもの。
あなたがしたい
sed --in-place 's/[[:space:]]\+$//' file
これにより、垂直タブやフォーム フィードを含む、POSIX 標準で定義されたすべての空白文字が削除されます。また、0 個以上のマッチャー ( ) を使用する他の回答とは異なり、末尾の空白が実際に存在する場合にのみ置換を行います*
。
--in-place
は単純に の長い形式です-i
。スクリプトでは長い形式を使用することを好みます。これは、フラグが実際に何をするかをより具体的に示す傾向があるためです。
find
次のように簡単に統合できます。
find . -type f -name '*.txt' -exec sed --in-place 's/[[:space:]]\+$//' {} \+
コメントで指摘されているように、gnu ツールがインストールされていない場合、上記は機能しません。その場合は、次を使用できます。
find . -iname '*.txt' -type f -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} \+
すべて 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 {} +
これを使用して空白を修正しました:
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 スタイルのファイルで問題なく動作します。file
テキスト ファイルと思われるファイルのみを変更します。sed 達人ではない人 (私自身も含む) のために、JavaScript 正規表現を使用してファイル内のテキストを置換する小さなスクリプトを作成し、その場で置換を行います。
末尾の空白を削除するには、次のように使用できます。
$ node sed.js "/^[\t ]*$/gm" "" file
楽しみ
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 で末尾の空白を削除するには?
何らかの理由で、sed および perl コマンドが機能しませんでした。これはしました:
find ./ -type f | rename 's/ +$//g'
読むのも最も簡単なもののように感じます