末尾のスペースを削除するには
sed -i 's/[ \t]*$//' *.txt
ただし、このコマンドはすべてのファイルを書き換えます。
テキスト ファイルに末尾のスペースがあるかどうかを判断し、末尾のスペースがないものについてはスキップする便利な方法はありますか?
答え1
変更が必要な行があるかどうかを確認するには firstを使用できますgrep
が、最悪の場合、ファイルを 2 回読み取ることになります (最後の行のみを変更する必要がある場合)。
for f in ./*.txt; do
grep -q '[[:blank:]]$' "$f" &&
sed -i 's/[[:blank:]]*$//' "$f"
done
答え2
1 つの方法は、find/grep/sed
次のとおりです。
find . -maxdepth 1 -type f -name '*.txt' \
-exec grep -q '[[:blank:]]$' {} \; \
-exec sed -Ei -e 's/[[:blank:]]+$//' {} +
- -maxdepth が 1 の場合、find は現在のディレクトリ内で動作します。
{} \;
は渡されるファイル名を参照しておりgrep
、\;
コマンド終了を示すシェルメタ文字のセミコロンをエスケープしています。エスケープするのは まで到達するためです-exec
。代わりに次のように書くこともできます。';'
{} +
すでにご存知のとおり{}
、これ+
は に可能な限り多くのファイル名を渡すことを意味します(基本的に、現在の結果のsed
1 つを渡すのではなく、を呼び出す前に引数として使用する のリストを蓄積します)。これにより、呼び出し回数を最小限に抑えることができます。{}
find
{}
sed
sed
答え3
編集を実行し、違いがある場合にのみ元のファイルを置き換えます。
for file in *.txt
do
sed 's/[ \t]*$//' < "$file" > "$file.tmp.$$" || continue
cmp -s -- "$file" "$file.tmp.$$" ||
cat < "$file.tmp.$$" > "$file" ||
continue
rm -f -- "$file.tmp.$$"
done
答え4
以下はroaimaのアイデアすべてのファイルに対して式を実行しsed
、実際に変更されたファイルのみを保持する方法です。
呼び出し回数を減らすことでこれを変更しますsed
。
printf '%s\0' ./*.txt |
xargs -0 sed -i.bak 's/[[:blank:]]$//
次に、*.txt
ファイルを調べて元のファイルと比較し、保存したいファイルを選択します。
for name in ./*.txt; do
if cmp -s "$name" "$name.bak"; then
# keep original
mv "$name.bak" "$name"
else
# keep modified
rm "$name.bak"
fi
done
または、両方を一度に実行します。
printf '%s\0' ./*.txt |
xargs -0 sh -c '
sed -i.bak "s/[[:blank:]]$//" "$@"
for name do
if cmp -s "$name" "$name.bak"; then
mv "$name.bak" "$name"
else
rm "$name.bak"
fi
done' sh