How to remove trailing whitespaces for multiple files?

前端 未结 7 901
长发绾君心
长发绾君心 2020-12-12 14:04

Are there any tools / UNIX single liners which would remove trailing whitespaces for multiple files in-place.

E.g. one that could be used in the con

相关标签:
7条回答
  • 2020-12-12 14:43

    I've been using this to fix whitespace:

    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)
    

    Features:

    • Keeps carriage returns (unlike [:space:]), so it works fine on Windows/DOS-style files.
    • Only worries about "normal" whitespace - If you have vertical tabs or such in your files it's probably intentional (test code or raw data).
    • Skips the .git and .svn VCS directories.
    • Only modifies files which file thinks is a text file.
    • Reports all paths which were skipped.
    • Works with any filename.
    0 讨论(0)
  • 2020-12-12 14:46

    How about this:

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

    Btw, this is a handy site: http://sed.sourceforge.net/sed1line.txt

    0 讨论(0)
  • 2020-12-12 14:50

    For some reason, the sed and perl commands did not work for me. This did :

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

    Feels like the most straight forward one to read as well

    0 讨论(0)
  • 2020-12-12 14:55

    You want

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

    That will delete all POSIX standard defined whitespace characters, including vertical tab and form feed. Also, it will only do a replacement if the trailing whitespace actually exists, unlike the other answers that use the zero or more matcher (*).

    --in-place is simply the long form of -i. I prefer to use the long form in scripts because it tends to be more illustrative of what the flag actually does.

    It can be easily integrated with find like so:

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

    If you're on a Mac

    As pointed out in the comments, the above doesn't work if you don't have gnu tools installed. If that's the case, you can use the following:

    find . -iname '*.txt' -type f -exec sed -i '' 's/[[:space:]]\{1,\}$//' {} \+
    
    0 讨论(0)
  • 2020-12-12 14:55

    Unlike other solutions which all require GNU sed, this one should work on any Unix system implementing POSIX standard commands.

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

    Edit: this slightly modified version preserves the files permissions:

    find . -type f -name "*.txt" -exec sh -c 'for i;do sed 's/[[:space:]]*$//' "$i">/tmp/.$$ && cat /tmp/.$$ > "$i";done' arg0 {} +
    
    0 讨论(0)
  • 2020-12-12 14:55

    ex

    Try using Ex editor (part of Vim):

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

    Note: For recursion (bash4 & zsh), you can use a new globbing option (**/*.*). Enable by shopt -s globstar.

    perl

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

    as per Spring Framework Code Style.

    sed

    For using sed, check: How to remove trailing whitespaces with sed?


    See also: How to remove trailing whitespace of all files recursively?

    0 讨论(0)
提交回复
热议问题