lcomma() { sed '
$x;$G;/\(.*\),/!H;//!{$!d
}; $!x;$s//\1/;s/^\n//'
}
এটি ,
কোনও ইনপুট ফাইলে কেবলমাত্র শেষ ঘটনাটি সরিয়ে ফেলতে পারে - এবং এটি এখনও মুদ্রণ করবে যেখানে একটি ,
ঘটে না। মূলত, এটি লাইনের ক্রমগুলিকে বাফার করে যাতে কমা থাকে না।
যখন এটি কোনও কমাটির মুখোমুখি হয় তখন এটি হোল্ড বাফারের সাথে বর্তমান লাইন বাফারকে অদলবদল করে এবং সেভাবে একই সাথে শেষ কমা থেকে ঘটে যাওয়া সমস্ত লাইন মুদ্রণ করে এবং এর হোল্ড বাফারকে মুক্ত করে।
আমি আমার ইতিহাস ফাইলটি খনন করছিলাম এবং এটি পেয়েছি:
lmatch(){ set "USAGE:\
lmatch /BRE [-(((s|-sub) BRE)|(r|-ref)) REPL [-(f|-flag) FLAG]*]*
" "${1%"${1#?}"}" "$@"
eval "${ZSH_VERSION:+emulate sh}"; eval '
sed " 1x; \\$3$2!{1!H;\$!d
}; \\$3$2{x;1!p;\$!d;x
}; \\$3$2!x;\\$3$2!b'"
$( unset h;i=3 p=:-:shfr e='\033[' m=$(($#+1)) f=OPTERR
[ -t 2 ] && f=$e\2K$e'1;41;17m}\r${h-'$f$e\0m
f='\${$m?"\"${h-'$f':\t\${$i$e\n}\$1\""}\\c' e=} _o=
o(){ IFS=\ ;getopts $p a "$1" &&
[ -n "${a#[?:]}" ] &&
o=${a#-}${OPTARG-${1#-?}} ||
! eval "o=$f;o=\${o%%*\{$m\}*}"
}; a(){ case ${a#[!-]}$o in (?|-*) a=;;esac; o=
set $* "${3-$2$}{$((i+=!${#a}))${a:+#-?}}"\
${3+$2 "{$((i+=1))$e"} $2
IFS=$; _o=${_o%"${3+$_o} "*}$*\
}; while eval "o \"\${$((i+=(OPTIND=1)))}\""
do case ${o#[!$a]} in
(s*|ub) a s 2 '' ;;
(r*|ef) a s 2 ;;
(f*|lag) a ;;
(h*|elp) h= o; break ;;
esac; done; set -f; printf "\t%b\n\t" $o $_o
)\"";}
এটা আসলে বেশ ভাল। হ্যাঁ, এটি ব্যবহার করে eval
তবে এটি তার যুক্তিগুলির সংখ্যাসমুহ রেফারেন্সের বাইরে এটি কোনও কিছুতেই পাস করে না। এটি sed
শেষ ম্যাচটি পরিচালনা করার জন্য স্বেচ্ছাসেবী স্ক্রিপ্টগুলি তৈরি করে । আমি তোমাকে দেখাব:
printf "%d\" %d' %d\" %d'\n" $(seq 5 5 200) |
tee /dev/fd/2 |
lmatch d^.0 \ #all re's delimit w/ d now
-r '&&&&' \ #-r or --ref like: '...s//$ref/...'
--sub \' sq \ #-s or --sub like: '...s/$arg1/$arg2/...'
--flag 4 \ #-f or --flag appended to last -r or -s
-s\" \\dq \ #short opts can be '-s $arg1 $arg2' or '-r$arg1'
-fg #tacked on so: '...s/"/dq/g...'
যে stderr নিম্নলিখিত মুদ্রণ। এটি lmatch
এর ইনপুটটির অনুলিপি :
5" 10' 15" 20'
25" 30' 35" 40'
45" 50' 55" 60'
65" 70' 75" 80'
85" 90' 95" 100'
105" 110' 115" 120'
125" 130' 135" 140'
145" 150' 155" 160'
165" 170' 175" 180'
185" 190' 195" 200'
ফাংশনের eval
এড সাবশেল একবারে তার সমস্ত আর্গুমেন্টের মাধ্যমে পুনরাবৃত্তি করে। এটি তাদের উপর দিয়ে হাঁটার সময় এটি প্রতিটি পাল্টানোর প্রসঙ্গে নির্ভর করে যথাযথভাবে একটি কাউন্টারকে পুনরাবৃত্তি করে এবং পরবর্তী পুনরাবৃত্তির জন্য অনেকগুলি আর্গুমেন্ট এড়িয়ে যায়। তারপরে এটি আর্গুমেন্ট অনুসারে কয়েকটি জিনিসের একটি করে:
- প্রতিটি বিকল্পের জন্য বিকল্পটি পার্সার যুক্ত
$a
করে $o
। প্রক্রিয়াকৃত প্রতিটি আরগের জন্য আরগের গণনা দ্বারা বাড়ানো $a
মানটির উপর ভিত্তি করে নির্ধারিত হয় $i
। $a
নিম্নলিখিত দুটি মানগুলির মধ্যে একটি নির্ধারিত হয়:
a=$((i+=1))
- যদি সংক্ষিপ্ত-বিকল্পের সাথে তার যুক্তি যুক্ত না হয় বা বিকল্পটি দীর্ঘ হয় তবে এটি নির্ধারিত হয়।
a=$i#-?
- এই যদি বিকল্প একটি সংক্ষিপ্ত এক এবং নির্ধারিত হয় না তার ARG এটি যোগ করা আছে।
a=\${$a}${1:+$d\${$(($1))\}}
- প্রাথমিক অ্যাসাইনমেন্ট নির্বিশেষে, $a
এর মান সর্বদা ব্রেসগুলিতে আবৃত থাকে এবং - একটি -s
ক্ষেত্রে - কখনও কখনও $i
আরও একটি বাড়ানো হয় এবং অতিরিক্তভাবে সীমিত ক্ষেত্র যুক্ত হয়।
ফলস্বরূপ যে eval
কোনও অজানা সমন্বিত স্ট্রিংটি কখনই পাস হয় না। কমান্ড-লাইনগুলির প্রতিটি আর্গুমেন্টকে তাদের সংখ্যাসূচক আর্গুমেন্ট নম্বর দ্বারা উল্লেখ করা হয় - এমনকী ডিলিমিটার যা প্রথম যুক্তির প্রথম অক্ষর থেকে নিষ্কাশিত হয় এবং কেবলমাত্র যখনই আপনি অনির্বাচিত না হয় তার অক্ষর ব্যবহার করা উচিত। মূলত, ফাংশন একটি ম্যাক্রো জেনারেটরের - এটা কোন বিশেষ পদ্ধতিতে আর্গুমেন্ট 'মান ব্যাখ্যা করে না কারণ sed
করতে পারেন (এবং, অবশ্যই হবে) সহজে যখন এটি স্ক্রিপ্ট parses যে হ্যান্ডেল। পরিবর্তে, এটি কেবল বোধগম্যভাবে তার আরোগুলিকে একটি কার্যক্ষম স্ক্রিপ্টে সাজিয়েছে।
কার্যক্ষেত্রে ফাংশনের কিছু ডিবাগ আউটপুট এখানে রয়েছে:
... sed " 1x;\\$2$1!{1!H;\$!d
}; \\$2$1{x;1!p;\$!d;x
}; \\$2$1!x;\\$2$1!b
s$1$1${4}$1
s$1${6}$1${7}$1${9}
s$1${10#-?}$1${11}$1${12#-?}
"
++ sed ' 1x;\d^.0d!{1!H;$!d
}; \d^.0d{x;1!p;$!d;x
}; \d^.0d!x;\d^.0d!b
sdd&&&&d
sd'\''dsqd4
sd"d\dqdg
'
এবং তাই lmatch
কোনও ফাইলের শেষ ম্যাচের পরে ডেটাগুলিতে সহজেই রেজিজেস প্রয়োগ করতে ব্যবহার করা যেতে পারে। আমি উপরে যে কমান্ডটি চালিয়েছি তার ফলাফল:
5" 10' 15" 20'
25" 30' 35" 40'
45" 50' 55" 60'
65" 70' 75" 80'
85" 90' 95" 100'
101010105dq 110' 115dq 120'
125dq 130' 135dq 140sq
145dq 150' 155dq 160'
165dq 170' 175dq 180'
185dq 190' 195dq 200'
... যা, শেষ বারের /^.0/
সাথে মিলিত হওয়া ফাইল ইনপুটটির উপসেটটি দেওয়া হলে নিম্নলিখিত বিকল্পগুলি প্রয়োগ করে:
sdd&&&&d
- $match
নিজের সাথে 4 বার প্রতিস্থাপন করে।
sd'dsqd4
- শেষ ম্যাচ থেকে লাইন শুরু হওয়ার পরে চতুর্থ একক-উদ্ধৃতি।
sd"d\dqd2
- ডাইটো, তবে ডাবল-কোট এবং বিশ্বব্যাপী।
এবং তাই, lmatch
কোনও ফাইলের মধ্যে শেষ কমা অপসারণ করতে কেউ কীভাবে ব্যবহার করতে পারে তা প্রদর্শনের জন্য:
printf "%d, %d %d, %d\n" $(seq 5 5 100) |
lmatch '/\(.*\),' -r\\1
আউটপুট:
5, 10 15, 20
25, 30 35, 40
45, 50 55, 60
65, 70 75, 80
85, 90 95 100