কীভাবে সেড দিয়ে ট্রেলিং হোয়াইটস্পেসগুলি সরিয়ে ফেলবেন?


113

আমার কাছে একটি সরল শেল স্ক্রিপ্ট রয়েছে যা কোনও ফাইল থেকে পেছনের সাদা স্থান সরিয়ে দেয়। এই স্ক্রিপ্টটিকে আরও কমপ্যাক্ট করার কোনও উপায় আছে (কোনও অস্থায়ী ফাইল তৈরি না করে)?

sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp

2
আপনি এর mvপরিবর্তে catএবং ব্যবহার করতে পারেন rm। আপনি catযেভাবে যাইহোক এরকম ব্যবহার করছেন ? কেন ব্যবহার cpকরবেন না ?
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
এই প্রশ্নটি থেকে আমি যে জ্ঞানটি শিখেছি তা ব্যবহার করে পিছনে সাদা স্থানটি পুনরাবৃত্তভাবে অপসারণের জন্য একটি শেল স্ক্রিপ্ট তৈরি করতে পারি ।
ডেভিড Tuite



নোট করুন যে catমূল ফাইলটির পরিবর্তে মূল ফাইলটি ওভাররাইট করতে ব্যবহার করে মূল ফাইলের mvডেটা প্রতিস্থাপন করা হবে (যেমন, এটি হার্ড লিঙ্কগুলিকে ভাঙবে না)। sed -iঅনেকগুলি সমাধানে প্রস্তাবিত হিসাবে ব্যবহার করা এটি করবে না। আইওউউ, আপনি যা করছেন কেবল তা চালিয়ে যান।
উইলিয়াম পার্সেল

উত্তর:


157

আপনি জায়গা বিকল্প ব্যবহার করতে পারেন -iএর sedLinux এবং ইউনিক্স জন্য:

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

সচেতন হন এক্সপ্রেশনটি tওএসএক্স-এ ট্রেলিংটি মুছে ফেলবে (আপনি gsedএই সমস্যা এড়াতে ব্যবহার করতে পারেন )। এটি বিএসডি-তেও মুছে ফেলতে পারে।

আপনি যদি অনুমান না করে থাকেন তবে এখানে OSX এ সঠিক (তবে পড়ার পক্ষে কঠোর) সেড সিনট্যাক্সটি রয়েছে:

sed -i '' -E 's/[ '$'\t'']+$//' "$1"

তিনটি একক-উদ্ধৃত স্ট্রিংগুলি শেষ পর্যন্ত একক যুক্তি / অভিব্যক্তিতে সংক্ষিপ্ত হয়ে যায়। বাশে কোনও কনটাক্টেশন অপারেটর নেই, আপনি কেবল একের পর এক স্ট্রিং রাখুন যার মধ্যে কোনও স্থান নেই।

$'\t'ব্যাশ একটি আক্ষরিক ট্যাব-অক্ষর যেমন সমাধান করা (ব্যবহার ANSI-সি উদ্ধৃত ,) তাই ট্যাব সঠিকভাবে অভিব্যক্তি মধ্যে ঘনিভূত হয়।


1
আমি আমার মেশিনে নিম্নলিখিতটি পেয়েছি যা আমি আপডেট করতে পারি না: sed: Not a recognized flag: i
javaPlease42

2
HM। এটি এই অর্থেও বগী যে এটি "টি" এর সমস্ত পেছন সরিয়ে ফেলবে :)
শুভ ব্যক্তি

2
"সেড: স্বীকৃত পতাকা নয়: i -" এটি OSX এ ঘটে on ম্যাক্স-এ-এর পরে ব্যাকআপ ফাইলের জন্য আপনাকে একটি এক্সটেনশন যুক্ত করতে হবে। উদাহরণস্বরূপ:
সেড-আই .বাক

1
@ গুডপারসন যদি আপনি মজা করছেন না, তবে আপনি সম্ভবত t:) পালাতে ভুলে গেছেন \tযাঁরা ইতিমধ্যে জানেন না তাদের জন্য একটি ট্যাব।
শান অলরেড

2
@ সান অ্যালার্ড মজা করছে না: আপনি জিএনইউ সেড ব্যবহার করতে না পারলে এটি সম্পূর্ণরূপে নষ্ট হয়ে যায় (যা অন্য অনেক উপায়ে নষ্ট হয়ে যায়)
গুড পার্সন

59

কমপক্ষে মাউন্টেন সিংহটিতে, ভিক্টরের উত্তর লাইনটির শেষে যখন 'টি' অক্ষরটি সরিয়ে ফেলবে। নিম্নলিখিত সমস্যাগুলি এই সমস্যাটি সমাধান করে:

sed -i '' -e's/[[:space:]]*$//' "$1"

1
আমার সেডও একটি -Eনির্দেশক "বর্ধিত (আধুনিক) নিয়মিত এক্সপ্রেশন" চেয়েছিল
জ্যারেড বেক

ওএস এক্স-এ মনোযোগের মতো কাজ করে you আপনাকে অনেক ধন্যবাদ।
jwww

1
কোডডটিক্ট এর উত্তরটি ওএস এক্সে (এখন ম্যাকোস) একই সমস্যা রয়েছে। এই প্ল্যাটফর্মের এটিই একমাত্র সমাধান।
ফ্রাঙ্কলিন ইউ

@JaredBeck খনি sedএল ক্যাপটেনের উপর না।
ফ্রাঙ্কলিন ইউ

19

-iবিকল্পটি প্রস্তাব করার জন্য কোডাডিক্টকে ধন্যবাদ ।

নীচের কমান্ডটি স্নো চিতাবাঘের সমস্যার সমাধান করে

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

আমি এটি এখানে পেয়েছি, joemaller.com/823/quick-note-about-seds-edit-in-place-option
ভিক্টর

7
@ অ্যাক্রোলেট যেমন বলেছেন, আপনি জিএনইউ সেড ছাড়া অন্য সেড \tদিয়ে ব্যবহার করতে পারবেন না এবং এটি আক্ষরিক অক্ষর হিসাবে ব্যাখ্যা করা যায় t। কমান্ডটি কেবলমাত্র কাজ করে দেখা যাচ্ছে, সম্ভবত tআপনার ফাইলের বাকী সাদা অংশে কোনও ট্যাব নেই বা কোনও বাক্য শেষে নেই because ''ব্যাকআপ প্রত্যয় নির্দিষ্ট না করে ব্যবহার করার পরামর্শ দেওয়া হয় না।
স্ক্রুটিনাইজার


5
var1="\t\t Test String trimming   "
echo $var1
Var2=$(echo "${var1}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo $Var2

1
আরে, এটাই আমার দরকার ছিল! পোস্ট করা অন্যান্য সেড সমাধানগুলিতে আমার বাশ স্ক্রিপ্টে পাইপযুক্ত (এবং পাইপড এবং পাইপড ...) ভেরিয়েবল অ্যাসাইনমেন্টের সাথে ইন্টিগ্রেশন করার বিষয়টি ছিল, তবে আপনার বাক্সটি কার্যকর হয়নি।
এরিক এল।

4

আমার .bashrc এ আমার একটি স্ক্রিপ্ট রয়েছে যা ওএসএক্স এবং লিনাক্সের অধীনে কাজ করে (কেবলমাত্র বাশ!)

function trim_trailing_space() {
  if [[ $# -eq 0 ]]; then
    echo "$FUNCNAME will trim (in place) trailing spaces in the given file (remove unwanted spaces at end of lines)"
    echo "Usage :"
    echo "$FUNCNAME file"
    return
  fi
  local file=$1
  unamestr=$(uname)
  if [[ $unamestr == 'Darwin' ]]; then
    #specific case for Mac OSX
    sed -E -i ''  's/[[:space:]]*$//' $file
  else
    sed -i  's/[[:space:]]*$//' $file
  fi
}

যা আমি যুক্ত:

SRC_FILES_EXTENSIONS="js|ts|cpp|c|h|hpp|php|py|sh|cs|sql|json|ini|xml|conf"

function find_source_files() {
  if [[ $# -eq 0 ]]; then
    echo "$FUNCNAME will list sources files (having extensions $SRC_FILES_EXTENSIONS)"
    echo "Usage :"
    echo "$FUNCNAME folder"
    return
  fi
  local folder=$1

  unamestr=$(uname)
  if [[ $unamestr == 'Darwin' ]]; then
    #specific case for Mac OSX
    find -E $folder -iregex '.*\.('$SRC_FILES_EXTENSIONS')'
  else
    #Rhahhh, lovely
    local extensions_escaped=$(echo $SRC_FILES_EXTENSIONS | sed s/\|/\\\\\|/g)
    #echo "extensions_escaped:$extensions_escaped"
    find $folder -iregex '.*\.\('$extensions_escaped'\)$'
  fi
}

function trim_trailing_space_all_source_files() {
  for f in $(find_source_files .); do trim_trailing_space $f;done
}

3

যারা দক্ষতার সন্ধান করেন (প্রক্রিয়া করার জন্য অনেকগুলি ফাইল, বা বিশাল ফাইলগুলি), +পুনরাবৃত্তি অপারেটরটি ব্যবহার না *করে কমান্ডটিকে দ্বিগুণ দ্রুততর করে তোলে।

জিএনইউ সেড সহ:

sed -Ei 's/[ \t]+$//' "$1"
sed -i 's/[ \t]\+$//' "$1"   # The same without extended regex

আমি দ্রুত অন্য কিছু চিহ্নিত করলাম: এর [ \t]পরিবর্তে ব্যবহার [[:space:]]করে প্রক্রিয়াটি উল্লেখযোগ্যভাবে গতি বাড়িয়েছে (জিএনইউ সেড ভি 4.4):

sed -Ei 's/[ \t]+$//' "$1"

real    0m0,335s
user    0m0,133s
sys 0m0,193s

sed -Ei 's/[[:space:]]+$//' "$1"

real    0m0,838s
user    0m0,630s
sys 0m0,207s

sed -Ei 's/[ \t]*$//' "$1"

real    0m0,882s
user    0m0,657s
sys 0m0,227s

sed -Ei 's/[[:space:]]*$//' "$1"

real    0m1,711s
user    0m1,423s
sys 0m0,283s

1

শুধুই মজার জন্য:

#!/bin/bash

FILE=$1

if [[ -z $FILE ]]; then
   echo "You must pass a filename -- exiting" >&2
   exit 1
fi

if [[ ! -f $FILE ]]; then
   echo "There is not file '$FILE' here -- exiting" >&2
   exit 1
fi

BEFORE=`wc -c "$FILE" | cut --delimiter=' ' --fields=1`

# >>>>>>>>>>
sed -i.bak -e's/[ \t]*$//' "$FILE"
# <<<<<<<<<<

AFTER=`wc -c "$FILE" | cut --delimiter=' ' --fields=1`

if [[ $? != 0 ]]; then
   echo "Some error occurred" >&2
else
   echo "Filtered '$FILE' from $BEFORE characters to $AFTER characters"
fi

0

নির্দিষ্ট ক্ষেত্রে sed,-i অন্যরা ইতিমধ্যে উল্লিখিত বিকল্পটি সহজতম এবং সান্নিধ্যযুক্ত far

আরও সাধারণ ক্ষেত্রে, সংগ্রহ spongeথেকে moreutils, আপনি যা চান ঠিক তেমনটি করে: এটি আপনাকে কোনও প্রক্রিয়া প্রক্রিয়াকরণের ফলাফলের সাথে একটি ফাইল প্রতিস্থাপন করতে দেয়, বিশেষত ডিজাইনের মাধ্যমে ডিজাইনের প্রক্রিয়াটি ধাপটিকে নিজের উপর দিয়ে ট্রাইপিং থেকে রক্ষা করার জন্য তৈরি করা হয় যার ফাইলটি একেবারে ওভাররাইট করে rit কাজ চলছে. spongeম্যান পৃষ্ঠাটি উদ্ধৃত করতে :

স্পঞ্জ স্ট্যান্ডার্ড ইনপুট পড়ে এবং নির্দিষ্ট ফাইলটিতে এটি লিখে দেয়। শেল পুনর্নির্দেশের বিপরীতে, স্পঞ্জ আউটপুট ফাইলটি লেখার আগে তার সমস্ত ইনপুট আপ করে তোলে। এটি পাইপলাইনগুলি নির্মাণের অনুমতি দেয় যা একই ফাইল থেকে পড়ে এবং লেখতে পারে।

https://joeyh.name/code/moreutils/


-1

কমপক্ষে একটি নন-হোয়াইটস্পেস অক্ষরের লাইনগুলি থেকে কেবল সাদা বাক্সগুলি (আমার ক্ষেত্রে স্পেস এবং ট্যাবগুলিতে) ফেলা (এইভাবে খালি ইন্ডেন্টেড লাইনগুলি স্পর্শ করা হয় না):

sed -i -r 's/([^ \t]+)[ \t]+$/\1/' "$file"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.