আমি একবার নিয়ে এসেছেন এই যা আমরা করতে পরিমার্জন করতে পারেন:
perl -0777 -pe '
BEGIN{
$bs=qr{(?:\\|\?\?/)};
$lc=qr{(?:$bs\n|$bs\r\n?)}
}
s{
/$lc*\*.*?\*$lc*/
| /$lc*/(?:$lc|[^\r\n])*
| (
"(?:$bs$lc*.|.)*?"
| '\''$lc*(?:$bs$lc*(?:\?\?.|.))?(?:\?\?.|.)*?'\''
| \?\?'\''
| .[^'\''"/?]*
)
}{$1 eq "" ? " " : "$1"}exsg'
আরও কয়েকটি কর্নারের কেসগুলি পরিচালনা করতে।
মনে রাখবেন যে আপনি যদি কোনও মন্তব্য মুছে ফেলেন , আপনি 1-/* comment */-1কোডটির অর্থ পরিবর্তন করতে পারেন ( এমন 1 - -1সময় পার্স করা হয়েছে 1--1(যা আপনি মন্তব্যটি সরিয়ে দিলে আপনি পাবেন) আপনাকে একটি ত্রুটি দেয়))। মন্তব্যটি সম্পূর্ণরূপে অপসারণের পরিবর্তে স্থানের অক্ষর (যেমন আমরা এখানে করি) দিয়ে প্রতিস্থাপন করা ভাল।
উপরোক্তদের এই বৈধ এএনএসআই সি কোডটিতে সঠিকভাবে কাজ করা উচিত উদাহরণস্বরূপ যে কয়েকটি কোণার কেস অন্তর্ভুক্ত করার চেষ্টা করে:
# অন্তর্ভুক্ত <stdio.h>
প্রধান প্রধান ()
{
প্রিন্টফ ("% d% s% সি% সি% সি% সি% সি% সি% ডি \ n",
1 - / * মন্তব্য * / - 1,
/ \
* মন্তব্য * /
"/ * কোনও মন্তব্য নয় * /",
/ * বহুরেখা
মন্তব্য * /
'"' / * মন্তব্য * /, '"',
'\' ',' '' / * মন্তব্য * /,
'\
\
"', / * মন্তব্য * /
"\\
"/ * কোনও মন্তব্য নয় * /",
"?? /" / * কোনও মন্তব্য নয় * / ",
'??' '+' "'/ *" মন্তব্য "* /);
প্রত্যাবর্তন 0;
}
যা এই আউটপুট দেয়:
# অন্তর্ভুক্ত <stdio.h>
প্রধান প্রধান ()
{
প্রিন্টফ ("% d% s% সি% সি% সি% সি% সি% সি% ডি \ n",
1- -1,
"/ * কোনও মন্তব্য নয় * /",
'' ',' '',
'\' ',' '',
'\
\
" ',
"\\
"/ * কোনও মন্তব্য নয় * /",
"?? /" / * কোনও মন্তব্য নয় * / ",
'??' '+' "');
প্রত্যাবর্তন 0;
}
উভয়ই একই আউটপুট মুদ্রণ যখন কম্পাইল এবং চালানো হয়।
gcc -ansi -Eপ্রাক-প্রসেসর এটিতে কী করবে তা দেখার জন্য আপনি আউটপুটটির সাথে তুলনা করতে পারেন। যে কোড এছাড়াও বৈধ C99 বা C11 কোড, তবে gcctrigraphs ডিফল্টরূপে সমর্থন অক্ষম তাই এটা করবে সঙ্গে কাজ করে না gcc, যদি না আপনার মত মান উল্লেখ gcc -std=c99বা gcc -std=c11অথবা অ্যাড -trigraphsবিকল্প)।
এটি এই সি 99 / সি 11 (নন-এএনএসআই / সি 90) কোডটিতেও কাজ করে:
// মন্তব্য
/ \
/ মন্তব্য
// বহুরেখা
মন্তব্য
"// মন্তব্য নয়"
( gcc -E/ gcc -std=c99 -E/ সাথে তুলনা করুন gcc -std=c11 -E)
এএনএসআই সি // formমন্তব্যটির সমর্থন করেনি । //এএনএসআই সিতে অন্যথায় বৈধ নয় তাই সেখানে উপস্থিত হবে না। এক কল্পিত কেস যেখানে //সত্যি সত্যি ANSI সি প্রদর্শিত হতে পারে (যেমন সুপরিচিত সেখানে , এবং আপনি আলোচনা আকর্ষণীয় বাকি খুঁজে পেতে পারেন) যখন stringify অপারেটর ব্যবহার করা হচ্ছে।
এটি একটি বৈধ এএনএসআই সি কোড:
#define s(x) #x
s(//not a comment)
এবং 2004 সালে আলোচনার সময়ে, gcc -ansi -Eপ্রকৃতপক্ষে এটি প্রসারিত করেছিল "//not a comment"। যাইহোক, আজ gcc-5.4এটিতে একটি ত্রুটি ফেরায়, তাই আমি সন্দেহ করব যে আমরা এই ধরণের কনস্ট্রাক্ট ব্যবহার করে প্রচুর সি কোড পেয়ে যাব।
জিএনইউ sedসমমানের মতো কিছু হতে পারে:
lc='([\\%]\n|[\\%]\r\n?)'
sed -zE "
s/_/_u/g;s/!/_b/g;s/</_l/g;s/>/_r/g;s/:/_c/g;s/;/_s/g;s/@/_a/g;s/%/_p/g;
s@\?\?/@%@g;s@/$lc*\*@:&@g;s@\*$lc*/@;&@g
s:/$lc*/:@&:g;s/\?\?'/!/g
s#:/$lc*\*[^;]*;\*$lc*/|@/$lc*/$lc*|(\"([\\\\%]$lc*.|[^\\\\%\"])*\"|'$lc*([\\\\%]$lc*.)?[^\\\\%']*'|[^'\"@;:]+)#<\5>#g
s/<>/ /g;s/!/??'/g;s@%@??/@g;s/[<>@:;]//g
s/_p/%/g;s/_a/@/g;s/_s/;/g;s/_c/:/g;s/_r/>/g;s/_l/</g;s/_b/!/g;s/_u/_/g"
যদি আপনার জিএনইউ sedসমর্থন করার জন্য খুব পুরানো হয় -Eবা -zআপনি প্রথম লাইনটি প্রতিস্থাপন করতে পারেন:
sed -r ":1;\$!{N;b1}