ddz*_*wmm 3 shell bash sed awk text-processing
我正在使用删除尾随空格
sed -i 's/[ \t]*$//' *.txt
Run Code Online (Sandbox Code Playgroud)
但是,此命令将重写所有文件。
有没有一种方便的方法来判断文本文件中是否有尾随空格并跳过那些没有尾随空格的?
ilk*_*chu 10
您可以使用grepfirst 来查找是否有需要修改的行,尽管这在最坏的情况下仍然会读取文件两次(在只有最后一行需要修改的情况下):
for f in ./*.txt; do
grep -q '[[:blank:]]$' "$f" &&
sed -i 's/[[:blank:]]*$//' "$f"
done
Run Code Online (Sandbox Code Playgroud)
一种方法可以find/grep/sed如图所示:
find . -maxdepth 1 -type f -name '*.txt' \
-exec grep -q '[[:blank:]]$' {} \; \
-exec sed -Ei -e 's/[[:blank:]]+$//' {} +
Run Code Online (Sandbox Code Playgroud)
{} \; 指的是要传递到的文件的名称,grep并且\;正在转义 shell 元字符分号,该分号是命令结束符。我们逃避它,让它到达-exec。你也可以将其写为';'{} + 您{}现在已经知道了,这+意味着您传递了尽可能多的文件名sed(基本上,不是传递{}当前结果的单个文件名,而是在调用之前累积要用作参数find的列表)。这使我们能够最大限度地减少调用次数。{}sedsed执行编辑,仅在存在差异时替换原始文件。
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
Run Code Online (Sandbox Code Playgroud)