পুনরাবৃত্তভাবে সমস্ত ফাইলের ট্রাইলিং হোয়াইটস্পেস কীভাবে সরিয়ে ফেলবেন?


122

আপনি কীভাবে পুরো প্রকল্পের সমস্ত চলমান সাদা স্থানকে সরিয়ে ফেলতে পারেন? একটি রুট ডিরেক্টরি থেকে শুরু করা এবং সমস্ত ফোল্ডারে সমস্ত ফাইল থেকে পূর্ববর্তী সাদা স্থান সরিয়ে ফেলা হচ্ছে।

এছাড়াও, আমি সরাসরি ফাইলটি সংশোধন করতে সক্ষম হতে চাই, এবং কেবল স্টডআউটে মুদ্রণ না করে।


ওহ, আপনি একটি "পোর্টেবল" সমাধান খুঁজছেন, বা আরও একটি ওএস-নির্দিষ্ট? আপনি কোন ওএস ব্যবহার করছেন?
জো পাইনেদা

3
আমি এর একটি সংস্করণ দেখতে চাই যা ওএস এক্স স্নো চিতাবাঘে কাজ করবে এবং .git এবং .svn ফোল্ডারগুলিকে উপেক্ষা করবে।
ট্রেভর টার্ক

উত্তর:


83

এখানে একটি ওএস এক্স> = 10.6 স্নো চিতা সলিউশন।

এটি .git এবং .svn ফোল্ডার এবং তাদের বিষয়বস্তু উপেক্ষা করে । এছাড়াও এটি কোনও ব্যাকআপ ফাইল ছাড়বে না।

export LC_CTYPE=C
export LANG=C
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"

10
প্রতিস্থাপনের স্ট্রিংয়ের \+পরিবর্তে *আপনি এটি ব্যবহার করে দ্রুততর করতে পারেন - অন্যথায় এটি প্রতিটি একক লাইনে মেলে।
l0b0

10
আপনি উভয় ট্যাব এবং স্পেসগুলি সরাতে [[: ফাঁকা:]] ব্যবহার করতে পারেন।
লিফ গ্রুইনওল্ড

21
মাউন্টেন সিংহ এ sed: RE error: illegal byte sequenceআমার জন্য ফিরে আসে ।
ব্রায়সন

12
আপনারা যাদের "অবৈধ বাইট সিকোয়েন্স" নিয়ে সমস্যা রয়েছে তাদের জন্য: প্রবেশ করুন export LANG=Cএবং আবার চেষ্টা করুন
জর্জি লেডারম্যান

3
OS X এর মধ্যে 10.9 আমিও প্রয়োজন export LC_CTYPE=C : যেমন এখানে পাওয়া stackoverflow.com/questions/19242275/...
kissgyorgy

31

ব্যবহার করুন:

find . -type f -print0 | xargs -0 perl -pi.bak -e 's/ +$//'

যদি আপনি ".bak" ফাইলগুলি তৈরি না করতে চান:

find . -type f -print0 | xargs -0 perl -pi -e 's/ +$//'

একটি zsh ব্যবহারকারী হিসাবে, আপনি কলটি বাদ দেওয়ার জন্য এটি সন্ধান করতে এবং এর পরিবর্তে ব্যবহার করতে পারেন:

perl -pi -e 's/ +$//' **/*

নোট: অন্তক প্রতিরোধ করার জন্য .gitডিরেক্টরির যোগ চেষ্টা করুন: -not -iwholename '*.git*'


37
গিট রেপোতে এটি ব্যবহার করবেন না, কারণ এটি গিটের অভ্যন্তরীণ স্টোরেজকে দূষিত করতে পারে।
মিগোল্ড

11
@ এমগোল্ড খুব দেরীতে, গ্রার; /
কেনোরব

3
স্পষ্ট করে বলার জন্য, গিট রেপো সাবফোল্ডারের ভিতরে এটি চালানো ঠিক আছে, গিট রেপো (গুলি) এর বংশধর হিসাবে যে কোনও ফোল্ডারের মধ্যে নয়, অর্থাত্ .gitডিরেক্টরিগুলি রয়েছে এমন কোনও ফোল্ডারের ভিতরে নয় , যতই গভীরভাবে বাসা বাঁধে না।
ইলিয়া মোসকভিন

গিটার / এসএনএন সমস্যাগুলি এড়াতে @ ডিপওয়েলের সাথে এই উত্তরটির সংমিশ্রণfind . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
উইলিয়াম ডেনিস

1
সম্ভবত আরও ভাল উপায় আছে, তবে আমি আলাদা গোল্ডারে রেপো ক্লোন করে এবং এরপরে এমন একটি গিট রেপো ম্যাংলিং থেকে পুনরুদ্ধার করেছি rsync -rv --exclude=.git repo/ repo2/যার পরে স্থানীয় পরিবর্তনগুলিও repo(অপরিশোধিত) ছিল repo2
ম্যাট্রিক্সম্যানএটিআইআরসেবা

29

দুটি বিকল্প পন্থা যা ডস নিউলাইনগুলি (সিআর / এলএফ) এর সাথেও কাজ করে এবং বাইনারি ফাইলগুলি এড়ানোর জন্য খুব ভাল কাজ করে :

জেনেরিক সমাধান যা মাইম টাইপ দিয়ে শুরু করে তা পরীক্ষা করে text/:

while IFS= read -r -d '' -u 9
do
    if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
    then
        sed -i 's/[ \t]\+\(\r\?\)$/\1/' -- "$REPLY"
    else
        echo "Skipping $REPLY" >&2
    fi
done 9< <(find . -type f -print0)

ম্যাট দ্বারা গিট সংগ্রহস্থল-নির্দিষ্ট সমাধান যা গিটকে বাইনারি হিসাবে বিবেচনা করে এমন ফাইলগুলি এড়িয়ে যাওয়ার-Iবিকল্পব্যবহার করেgit grep:

git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'

3
সুতরাং আমি এই গিট সমাধানটি সত্যিই পছন্দ করি। এটি সত্যই শীর্ষে থাকা উচিত। আমি যদিও গাড়ীর রিটার্ন সংরক্ষণ করতে চাই না। তবে আমি এটি 2010 এর সাথে সংযুক্ত একটিকে পছন্দ করি
-

আমার গিট অভিযোগ করেছে
যে- এই ভাবটি

@okor সালে গনুহ sedকরার প্রত্যয় বিকল্প -iনেই ঐচ্ছিক , কিন্তু বাসদsed এটা না। এটি এখানে কঠোরভাবে বলার দরকার নেই, সুতরাং আমি এটি সরিয়ে ফেলব।
l0b0

24

বাশে:

find dir -type f -exec sed -i 's/ *$//' '{}' ';'

দ্রষ্টব্য: আপনি ব্যবহার করেন, তাহলে .gitসংগ্রহালয় যোগ করার চেষ্টা: -not -iwholename '.git'


এটি পাওয়া প্রতিটি ফাইলের জন্য এই জাতীয় ত্রুটি উত্পন্ন করে। sed: 1: "dir / file.txt": কমান্ডটি একটি প্রত্যাশা করে \ তারপরে পাঠ্য অনুসরণ করবে
iamjwc

প্রতিস্থাপন ';' সঙ্গে \; কাজ করা উচিত. (এছাড়াও প্রায় {} এর উদ্ধৃতিগুলি কঠোরভাবে প্রয়োজন হয় না)।
অগ্নুল

4
সমস্ত স্পেসস্পেস সরিয়ে ফেলতে কেবল ফাঁকা জায়গা নয় আপনার স্থান নিয়মিত অভিব্যক্তিতে [: স্পেস:] দিয়ে স্থানের অক্ষরটি প্রতিস্থাপন করা উচিত।
ডাব্লুএমআর

অন্য দিকে নোট: এটি কেবল সেড সংস্করণ> = 4 নিয়ে কাজ করে, ছোট সংস্করণগুলি স্থান সম্পাদনাতে সমর্থন করে না।
ডাব্লুএমআর

1
এটি আমার গিট ভেঙেছে :(
ক্র্যাবম্যান

14

এটি OSX 10.5 চিতাবাঘে আমার জন্য কাজ করেছে, যা GNU সেড বা xargs ব্যবহার করে না।

find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"

আপনার যদি এই ফাইলগুলি বাদ দেওয়ার দরকার হয় তবে কেবল এটির সাথে সাবধান হন (আমি করেছি)!

নির্দিষ্ট ডিরেক্টরি বা ফাইল উপেক্ষা করার জন্য আপনি -প্রণ ব্যবহার করতে পারেন। গিট সংগ্রহস্থলের পাইথন ফাইলগুলির জন্য আপনি এমন কিছু ব্যবহার করতে পারেন:

find dir -not -path '.git' -iname '*.py'

কোন সুযোগ আপনি এই পরিষ্কার করতে পারে? আমি একটি কমান্ড চাই যা ".git" ডিরেক্টরিটিকে অগ্রাহ্য করার সাথে সাথে ডিরেক্টরিতে সমস্ত ফাইল থেকে পূর্ববর্তী সাদা স্থানটিকে পুনরাবৃত্তভাবে সরিয়ে ফেলবে। আমি আপনার উদাহরণটি পুরোপুরি অনুসরণ করতে পারি না ...
ট্রেভর টার্ক

আপনি যদি টিসিএস ব্যবহার করে থাকেন তবে আপনার ডাবল উদ্ধৃতিগুলি একক উদ্ধৃতিতে পরিবর্তন করতে হবে। অন্যথায়, আপনি একটি "অবৈধ ভেরিয়েবল নাম" পাবেন। ত্রুটি.
ব্র্যান্ডন ফসডিক

GNU সেড একই রকম তবে আপনি -i.bak বা --in-place = .বাক করেন, এর সম্পূর্ণ কমান্ড দিয়ে শেষ করুন find dir -not -path '.git' -iname '*.py' -print0 | xargs -0 sed --in-place=.bak 's/[[:space:]]*$//'dirপুনরাবৃত্তি করতে শীর্ষ-স্তরের হিসাবে প্রশ্নে থাকা ডিরেক্টরিটি দিয়ে প্রতিস্থাপন করুন ।
ডেভিড গার্ডনার

sed -i .bak? এটি sed -i.bak(স্থান ব্যতীত) হওয়া উচিত নয় ?
ওন্দ্র Žižka

9

আক এই ধরণের কাজের জন্য তৈরি হয়েছিল।

এটি ঠিক গ্রেপের মতোই কাজ করে, তবে .svn, .git, .cvs ইত্যাদির মতো জায়গায় নামতে জানে না knows

ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'

ফাইন্ড / গ্রেপ সহ হুপসের মধ্য দিয়ে ঝাঁপ দেওয়ার চেয়ে অনেক বেশি সহজ।

আক্ক বেশিরভাগ প্যাকেজ পরিচালকের মাধ্যমে (যেমন এস্ক বা এস্ক-গ্রেপ হয় ) উপলব্ধ।

এটি কেবল একটি পার্ল প্রোগ্রাম, সুতরাং এটি একটি একক-ফাইল সংস্করণেও উপলভ্য যা আপনি কেবল ডাউনলোড এবং চালাতে পারেন। দেখুন: আক ইনস্টল


ackম্ফগ. এটি বেশ কয়েক বছর ধরে ব্যবহার করা হয়েছে এবং বেশিরভাগ ডিস্ট্রোসের জন্য প্রায় সমস্ত প্যাকেজ রেপোতে উপলব্ধ।
ফিলিপ আলভারেজ

8

ex

প্রাক্তন সম্পাদক (ভিমের অংশ) ব্যবহার করে দেখুন :

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

দ্রষ্টব্য: পুনরাবৃত্তির জন্য (bash4 & zsh), আমরা একটি নতুন গ্লোব্বিং বিকল্প ( **/*.*) ব্যবহার করি । দ্বারা সক্ষম করুন shopt -s globstar

আপনি নিম্নলিখিত ফাংশনটি এতে যুক্ত করতে পারেন .bash_profile:

# Strip trailing whitespaces.
# Usage: trim *.*
# See: https://stackoverflow.com/q/10711051/55075
trim() {
  ex +'bufdo!%s/\s\+$//e' -cxa $*
}

sed

ব্যবহারের জন্য sed, চেক করুন: সেডের সাহায্যে পেছনের সাদা স্থানগুলি কীভাবে সরিয়ে ফেলা যায়?

find

remove_trail_spaces.shফাইলগুলি থেকে শ্বেত স্থানগুলি অনুসরণ করার জন্য নিম্নলিখিত স্ক্রিপ্টটি (যেমন ) সন্ধান করুন:

#!/bin/sh
# Script to remove trailing whitespace of all files recursively
# See: /programming/149057/how-to-remove-trailing-whitespace-of-all-files-recursively

case "$OSTYPE" in
  darwin*) # OSX 10.5 Leopard, which does not use GNU sed or xargs.
    find . -type f -not -iwholename '*.git*' -print0  | xargs -0 sed -i .bak -E "s/[[:space:]]*$//"
    find . -type f -name \*.bak -print0 | xargs -0 rm -v
    ;;
  *)
    find . -type f -not -iwholename '*.git*' -print0 | xargs -0 perl -pi -e 's/ +$//'
esac

আপনি যে ডিরেক্টরিটি স্ক্যান করতে চান তা থেকে এই স্ক্রিপ্টটি চালান। ওএসএক্স শেষে, এটি শেষ হওয়া সমস্ত ফাইল সরিয়ে ফেলবে .bak

বা শুধু:

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

যা স্প্রিং ফ্রেমওয়ার্ক কোড স্টাইল দ্বারা প্রস্তাবিত ।


find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;সকলের পরিবর্তে কেবল একটি পেছনের স্থান সরিয়ে দেয়।
কার্ল রিখটার

6

আমি ব্যাকআপ ফাইলগুলি না খুঁজে অনুসন্ধান এবং ব্যবহার না করে শেষ করেছি।

sed -i '' 's/[[:space:]]*$//g' **/*.*

ফাইল গাছের গভীরতার উপর নির্ভর করে এটি (সংক্ষিপ্ত সংস্করণ) আপনার প্রয়োজনের জন্য পর্যাপ্ত হতে পারে।

দ্রষ্টব্য, উদাহরণস্বরূপ এটি বাইনারি ফাইলও গ্রহণ করে।


নির্দিষ্ট ফাইলগুলির জন্য: সন্ধান করুন। -নম '* .আরবি' | xargs -I {} sed -i '' s / / [[স্পেস:]] * * $ // জি '{}
গৌতম রেগে

সেডের জন্য আপনার '' পরামিতি লাগবে না; অথবা আমি কিছু অনুপস্থিত হতে পারে। আমি এটি একটি প্রদত্ত ডিরেক্টরিতে সমস্ত ফাইলগুলিতে চেষ্টা করেছি, যেমন: সেড-আই 'এস / [[: স্পেস:]] * $ // জি' ইউজার / *। মি
মিরেসিয়া

6

ফাইলগুলি বাদ দেওয়ার পরিবর্তে, এখানে উপরে বর্ণের একটি ভিন্নতা স্পষ্টভাবে সাদা ফাইলগুলি ফাইলের এক্সটেনশনের উপর ভিত্তি করে তালিকাভুক্ত করে, যা আপনি ফালাটি কাটাতে চান, বিনা দ্বিধায় স্বাদ নিতে চান:

find . \( -name *.rb -or -name *.html -or -name *.js -or -name *.coffee -or \
-name *.css -or -name *.scss -or -name *.erb -or -name *.yml -or -name *.ru \) \
-print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"

এটি আমার জন্য কাজ করার জন্য আমার উদ্ধৃতি যুক্ত করতে হবে:-name "*.rb*"
হরলড্যাকার

5

আমি এটি চালিয়ে শেষ করেছি, যা পোজো এবং অ্যাডামস সংস্করণের মধ্যে একটি মিশ্রণ।

এটি চলমান সাদা স্থান এবং ট্র্যাকিং হোয়াইটস্পেসের অন্য রূপ, গাড়ি ফেরার উভয়ই পরিষ্কার করবে:

find . -not \( -name .svn -prune -o -name .git -prune \) -type f \
  -exec sed -i 's/[:space:]+$//' \{} \;  \
  -exec sed -i 's/\r\n$/\n/' \{} \;

এটি থাকলে .git ফোল্ডারটি স্পর্শ করবে না।

সম্পাদনা করুন : মন্তব্যটির পরে এটিকে কিছুটা নিরাপদ করুন, এতে ".git" বা ".svn" দিয়ে ফাইল নেওয়ার অনুমতি না দেয়। তবে সাবধান, আপনি কিছু পেলে এটি বাইনারি ফাইলগুলিকে স্পর্শ করবে । ব্যবহার করুন -iname "*.py" -or -iname "*.php"পরে -type fযদি আপনি শুধু এটা যেমন .py এবং .php ফাইল স্পর্শ করতে চাই।

আপডেট 2 : এটি এখন লাইনের শেষে সমস্ত ধরণের স্পেস প্রতিস্থাপন করে (যার অর্থ ট্যাবগুলিও বোঝায়)


4
কী হচ্ছে তা আমি জানি না, তবে এটি আমার গিট রেপোটিকে পুরোপুরি ফুঁপিয়েছিল এবং আমার চিত্রগুলির সাথে মিশে গেছে। জনগণ, আমার চেয়ে আরও যত্নশীল হোন!
mattalxndr

হ্যাঁ, এটি বাইনারি ফাইলগুলি নষ্ট করবে। তবে এটি আপনার গিট রেপোটিকে একেবারেই স্পর্শ করা উচিত নয়, কারণ এটি .git-ফোল্ডারের ভিতরে যা কিছু থাকে তা এড়িয়ে যায়। তবে সম্ভবত আপনি যদি একই ফোল্ডারে থাকেন।
ওডিনহো - ভেলমন্ট

4

এটি ভালভাবে কাজ করে .. নির্দিষ্ট ফাইলের জন্য অন্তর্ভুক্ত / অপসারণ:

egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'


3

আমি নিয়মিত ভাব প্রকাশ করি। 4 পদক্ষেপ:

  1. আপনার সম্পাদকটিতে মূল ফোল্ডারটি খুলুন (আমি ভিজ্যুয়াল স্টুডিও কোডটি ব্যবহার করি)।
  2. বাম দিকে অনুসন্ধান আইকনটি আলতো চাপুন এবং নিয়মিত অভিব্যক্তি মোড সক্ষম করুন।
  3. অনুসন্ধান বারে "+ \ n" এবং প্রতিস্থাপন বারে "\ n" লিখুন।
  4. "সমস্ত প্রতিস্থাপন করুন" এ ক্লিক করুন।

এটি সমস্ত ফাইলে প্রতিটি লাইনের শেষে সমস্ত চলমান স্থান সরিয়ে দেয়। এবং আপনি এমন কিছু ফাইল বাদ দিতে পারেন যা এই প্রয়োজনের সাথে খাপ খায় না।


2

1) অন্যান্য অনেক উত্তর ব্যবহার -E। আমি নিশ্চিত নই কেন, কারণ এটি অননুমোদিত BSD সামঞ্জস্য বিকল্প option -rপরিবর্তে ব্যবহার করা উচিত।

2) অন্যান্য উত্তর ব্যবহার -i ''। এটি ঠিক -i(বা -i''প্রিফার করা থাকলে) হওয়া উচিত , কারণ -iএর ঠিক পরে প্রত্যয় রয়েছে।

3) গিট নির্দিষ্ট সমাধান:

git config --global alias.check-whitespace \
'git diff-tree --check $(git hash-object -t tree /dev/null) HEAD'

git check-whitespace | grep trailing | cut -d: -f1 | uniq -u -z | xargs -0 sed --in-place -e 's/[ \t]+$//'

প্রথমটি একটি গিট ওরফে রেজিস্ট্রেশন করে check-whitespaceযা পূর্ববর্তী সাদা স্থানের সাথে ফাইলগুলি তালিকাভুক্ত করে। দ্বিতীয়টি sedতাদের উপর রান করে।

আমি সাধারণত এর \tচেয়ে বেশি ব্যবহার করি [:space:]কারণ আমি সাধারণত উল্লম্ব ট্যাব, ফর্ম ফিড এবং অবিচ্ছেদী স্থানগুলি দেখতে পাই না। আপনার পরিমাপ আলাদা হতে পারে।


1

এটিই আমার পক্ষে কাজ করে (ম্যাক ওএস এক্স ১০.৮, হোমব্রিউ দ্বারা প্রতিষ্ঠিত জিএনইউ সেড):

find . -path ./vendor -prune -o \
  \( -name '*.java' -o -name '*.xml' -o -name '*.css' \) \
  -exec gsed -i -E 's/\t/    /' \{} \; \
  -exec gsed -i -E 's/[[:space:]]*$//' \{} \; \
  -exec gsed -i -E 's/\r\n/\n/' \{} \;

ট্রেলিং স্পেসগুলি সরানো হয়েছে, ফাঁকা জায়গাগুলির সাথে ট্যাবগুলি প্রতিস্থাপন করে, উইন্ডোজ সিআরএলএফকে ইউনিক্সের সাথে প্রতিস্থাপন করবে \n

মজার বিষয় হ'ল সমস্ত পরিষ্কারের gsedনির্দেশাবলীর মাধ্যমে সমস্ত ফাইল স্থির হওয়ার আগে আমাকে এই 3-4 বার চালাতে হবে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.