আমি কীভাবে / *… * / / / * & * / এর আওতায় পড়ে সমস্ত অক্ষর মুছতে পারি?


12

আমি সেড এবং অজানা চেষ্টা করেছি, তবে চরিত্রটি "/" হিসাবে জড়িত না কারণ এটি ইতিমধ্যে সীমানা হিসাবে ডিলিমিটার হিসাবে রয়েছে।

আমি কীভাবে এটি অর্জন করতে পারি দয়া করে আমাকে জানান।

নীচে একটি নমুনার উদাহরণ রয়েছে W আমরা মন্তব্য করা বিভাগগুলি যেমন সরাতে চাই /*.....*/

/*This is to print the output
data*/
proc print data=sashelp.cars;
run;
/*Creating dataset*/
data abc;
set xyz;
run;

-বাশ-৪.১ $ সেডস, / *। ** /, জি 'পরীক্ষা। নীচে আমার প্রাপ্ত আউটপুটটি রয়েছে, প্রথম মন্তব্যটি এখনও সেখানে রয়েছে is / * এটি আউটপুট ডেটা প্রিন্ট করতে হয় * / proc মুদ্রণ ডেটা = sashelp.cars; চালানো; ডেটা এবিসি; xyz সেট; চালানো;
শারিক আলম

1
সম্পাদনার জন্য ধন্যবাদ। আপনি যদি নিজের পছন্দসই আউটপুটটিও অন্তর্ভুক্ত করেন তবে এটি আরও ভাল হবে। এছাড়াও আপনি কী চেষ্টা করেছেন এবং কীভাবে প্রশ্নে এটি ব্যর্থ হয়েছে মন্তব্যগুলিতে অন্তর্ভুক্ত করুন।
টেরডন

2
মন্তব্য বা মন্তব্য সীমানা যুক্ত স্ট্রিংয়ের আক্ষরিকের কী হওয়া উচিত? (উদাঃ INSERT INTO string_table VALUES('/*'), ('*/'), ('/**/');)
zwol

1
সম্পর্কিত (দুঃখিত আমি প্রতিরোধ করতে পারছি না!): কোডগলফ.স্ট্যাকেক্সেঞ্জার
সেকশনস

আমি আমার সমাধানটিকে আরও একটি সমাধান দিয়ে আপডেট করেছি, দয়া করে এখন যদি আপনার পক্ষে ভাল হয় তবে তা পরীক্ষা করে দেখুন।
লুসিয়ানো এন্ড্রেস মার্টিনি

উত্তর:


22

আমি মনে করি আমি একটি সহজ সমাধান খুঁজে পেয়েছি!

cpp -P yourcommentedfile.txt 

কিছু আপডেট:

ব্যবহারকারী ইলকাচু থেকে উদ্ধৃতি (ব্যবহারকারী মন্তব্য থেকে মূল পাঠ্য):

আমি জিসিসির বিকল্পগুলির সাথে কিছুটা খেলেছি: -প্রসেসপ্রসেসড বেশিরভাগ নির্দেশনা এবং ম্যাক্রো বিস্তৃতকরণকে অক্ষম করে দেবে (স্পষ্টতই # ডেফাইন এবং # অপারেশন ব্যতীত)। -DD যোগ করার ফলে সংজ্ঞাও ছেড়ে যাবে; এবং std = c89 নতুন স্টাইল // মন্তব্য উপেক্ষা করতে ব্যবহার করা যেতে পারে। এমনকি তাদের সাথে, সিপিপি মন্তব্যগুলি স্থানগুলি (এগুলি সরিয়ে দেওয়ার পরিবর্তে) পরিবর্তিত করে এবং ফাঁকা স্থান এবং খালি লাইনগুলি ভেঙে দেয়।

তবে আমি মনে করি এটি এখনও যুক্তিসঙ্গত এবং বেশিরভাগ ক্ষেত্রেই সহজ সমাধান, যদি আপনি ম্যাক্রো প্রসারণ এবং অন্যান্য জিনিসগুলি অক্ষম করেন তবে আমি মনে করি যে আপনি ভাল ফলাফল পাবেন ... - এবং হ্যাঁ আপনি আরও ভাল হওয়ার জন্য শেল স্ক্রিপ্টের সাথে এটি একত্রিত করতে পারেন you ... এবং আরো অনেক কিছু...


1
সি প্রিপ্রসেসর ব্যবহার করা সম্ভবত সবচেয়ে শক্তিশালী সমাধান। যেহেতু প্রিপ্রসেসর সম্ভবত সি মন্তব্যের সবচেয়ে শক্তিশালী পার্সার। চালাক।
গ্রোচামাল

14
তবে cppমন্তব্যগুলি অপসারণের চেয়ে আরও অনেক কিছু করবে (প্রক্রিয়া #include, বিল্টিনগুলি সহ ম্যাক্রোগুলি প্রসারিত করুন ...)
স্টাফেন চেজেলাস

3
@ লুসিওআনড্রেসমার্টিনি, না, tail -n +7কেবল প্রথম 7 লাইন সরিয়ে দেবে, এটি #includeপ্রক্রিয়াজাতকরণ বা ম্যাক্রো সম্প্রসারণকে আটকাবে না । echo __LINE__ | cppউদাহরণস্বরূপ চেষ্টা করুন । বাecho '#include /dev/zero' | cpp
স্টাফেন চেজেলাস 15

2
আপনি -Pযদি এটি করেন তবে আপনি সম্ভবত মোডটি ব্যবহার করতে চান । (এটি ব্যবহারের প্রয়োজনটিকে দূর করতে পারে tail))
zwol

3
আমি জিসিসির বিকল্পগুলির সাথে কিছুটা খেলেছি: -fpreprocessedসর্বাধিক দিকনির্দেশনা এবং ম্যাক্রো সম্প্রসারণ (ব্যতীত #defineএবং #undefস্পষ্টতই) অক্ষম করে দেব । যোগ করার -dDফলে সংজ্ঞাও ছেড়ে যাবে; এবং std=c89নতুন স্টাইলের //মন্তব্যগুলিকে উপেক্ষা করতে ব্যবহার করা যেতে পারে । এমনকি তাদের সাথে, cppমন্তব্যগুলি স্থানগুলি (এগুলি সরানোর পরিবর্তে) পরিবর্তিত করে এবং ফাঁকা স্থান এবং খালি লাইনগুলি ভেঙে দেয়।
ইলকচাচু

10

আমি একবার নিয়ে এসেছেন এই যা আমরা করতে পরিমার্জন করতে পারেন:

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}

পার্ল সমাধানটিতে মাল্টি লাইনের সমস্যা রয়েছে: এই আউটপুটটি দিয়ে এটি পরীক্ষা করুন => প্রতিধ্বনি- "" শুরু করুন / মন্তব্য মন্তব্য * / কম্যান্ড / * কম ment এনমেন্ট * /
সমাপ্তি

@ বাবি, আমার জন্য কাজ করে। আমি আমার পরীক্ষার ক্ষেত্রে একটি বহু-লাইন মন্তব্য এবং ফলাফল আউটপুট যুক্ত করেছি।
স্টাফেন চেজেলাস

আজকালকারের সাথে তুলনা করার জন্য সেরা জিনিসটি হবে gcc -std=c11 -E -P(এর -ansiঅন্য একটি নাম -std=c90)।
zwol

@zwol, ধারণাটি কোনও সি / সি ++ স্ট্যান্ডার্ড (সি 90, সি 11 বা অন্যান্য) এর জন্য লিখিত কোড হ্যান্ডেল করতে সক্ষম হবে। কঠোরভাবে বলতে গেলে, এটি সম্ভব নয় (আমার ২ য় স্বীকৃত উদাহরণ দেখুন)। কোডটি এখনও সি 90 কনস্ট্রাক্টসগুলি (যেমন ??') হ্যান্ডেল করার চেষ্টা করে , অতএব আমরা cpp -ansiসেগুলি এবং সি 99 / সি 11 এর সাথে তুলনা করি ... একটির (যেমন // xxx), তাই আমরা cpp(বা cpp -std=c11...) সাথে তুলনা করি
স্টাফেন চেজেলাস

@ জেওল, আমি কিছুটা স্পষ্ট করার প্রয়াসে পরীক্ষার কেস বিভক্ত করেছি। দেখে মনে হচ্ছে ট্রাইগ্রাফগুলি এখনও সি 11 এ রয়েছে, সুতরাং আমার দ্বিতীয় পরীক্ষার কেস যাইহোক স্ট্যান্ডার্ড সি নয়।
স্টাফেন চেজেলাস

6

সাথে sed:

হালনাগাদ

/\/\*/ {
    /\*\// {
        s/\/\*.*\*\///g;
        b next
    };

    :loop;
    /\*\//! {
        N;
        b loop
    };
    /\*\// {
        s/\/\*.*\*\//\n/g
    }
    :next
}

সমস্ত সম্ভব সমর্থন (মাল্টি লাইন মন্তব্য, [বা এবং] befor পরে ডেটা,);

 e1/*comment*/
-------------------
e1/*comment*/e2
-------------------
/*comment*/e2
-------------------
e1/*com
ment*/
-------------------
e1/*com
ment*/e2
-------------------
/*com
ment*/e2
-------------------
e1/*com
1
2
ment*/
-------------------
e1/*com
1
2
ment*/e2
-------------------
/*com
1
2
ment*/e2
-------------------
সঞ্চালন করুন:
$ sed -f command.sed FILENAME

e1
-------------------
e1e2
-------------------
e2
-------------------
e1

-------------------
e1
e2
-------------------

e2
-------------------
e1

-------------------
e1
e2
-------------------

e2
-------------------

ডেটার পরে শুরু হওয়া কোনও মন্তব্যের জন্য কাজ করবে না, যেমনproc print data 2nd /*another comment is here*/
ম্যাসস

@ মমস আপডেট হয়েছে, এটি দেখুন
বারপাবাবা

এটি স্ট্রিং লিটারেলের ভিতরে থাকা মন্তব্যগুলিতে হ্যান্ডেল করে না, যা এসকিউএল যা করে তার উপর নির্ভর করে আসলে ব্যাপার হতে পারে
zwol

4
 $ cat file | perl -pe 'BEGIN{$/=undef}s!/\*.+?\*/!!sg'

 proc print data=sashelp.cars;
 run;

 data abc;
 set xyz;
 run;

খালি রেখাগুলি যদি সরিয়ে ফেলুন:

 $ cat file | perl -pe 'BEGIN{$/=undef}s!/\*.+?\*/\n?!!sg'

সম্পাদনা করুন - স্টিফেনের সংক্ষিপ্ত সংস্করণ:

 $ cat file | perl -0777 -pe 's!/\*.*?\*/!!sg'

ভাল, আমি টেরডনের সাথে একমত: প্রত্যাশিত আউটপুটটি দেখতে দিন।
হ্যান্স শ্যু

বিটিডাব্লু: "/ * foo * / রান; / * বার * /" সমন্বিত একক লাইনে কী হবে? এটি কি "চালানো" উচিত? ?
হ্যান্স শ্যু

গ্রেট! তারপরে আমার সমাধান কাজ করে। দ্রষ্টব্য আমি অ-লোভী ব্যবহার করি: "। +?"
হ্যান্স শ্যু

2
-0777করার জন্য একটি ছোট উপায় হিসাবে দেখুনBEGIN{$/=undef}
স্টাফেন চেজেলাস

1
এর .*?পরিবর্তে সম্ভবত .+?যদি /**/একটি বৈধ মন্তব্যও হয়।
ইলকচাছ

2

এসইডি কমান্ড এবং কোনও স্ক্রিপ্ট ব্যবহার করে সমাধান নয়

আপনি এখানে:

sed 's/\*\//\n&/g' test | sed '/\/\*/,/\*\//d'

এনবি এটি ওএস এক্সে কাজ করে না, যদি না আপনি ইনস্টল করেন gnu-sed। তবে এটি লিনাক্স ডিস্ট্রোজে কাজ করে।


1
আপনি -iনতুন ফাইলটিতে আউটপুট পুনর্নির্দেশের পরিবর্তে জায়গাটিতে ফাইল সম্পাদনা করতে বিকল্প ব্যবহার করতে পারেন । বা -i.bakব্যাকআপ ফাইলটি আরও সুরক্ষিত
রাহুল

1
এটি সব ক্ষেত্রেও কাজ করছে না, একই লাইনে একটি মন্তব্য দেওয়ার চেষ্টা করুন এবং কী ঘটে তা দেখুন ... উদাহরণস্বরূপ xy set; / * পরীক্ষা * / আমি মনে করি আমাদের খুব সহজেই পারল লাগবে এটি এটিকে একটি সহজ উপায়ে সমাধান করতে।
লুসিয়ানো অ্যান্ড্রেস মার্টিনি

@ রাহুল ঠিক, উল্লেখ করার জন্য ধন্যবাদ। আমি এটি আরও সহজ রাখতে চেয়েছিলাম
ফারাজএক্স

আমি অত্যন্ত দুঃখিত যে এটি একই লাইনে মন্তব্যের জন্য কাজ করছে না।
লুসিয়ানো এন্ড্রেস মার্টিনি

@ লুসিওআনড্রেসমার্টিনি এখন তা করে!
ফারাজএক্স

1

sedএকসাথে এক লাইনে পরিচালিত হয়, তবে ইনপুটটিতে কয়েকটি মন্তব্য একাধিক লাইনে বিস্তৃত। অনুযায়ী /unix//a/152389/90751 , আপনাকে প্রথমে ব্যবহার করতে পারেন trকিছু অন্যান্য চরিত্র মধ্যে লাইন বিরতি চালু করতে। তারপরে sedইনপুটটিকে একক লাইন হিসাবে প্রক্রিয়া করতে পারে এবং trলাইন-ব্রেকগুলি পুনরুদ্ধার করতে আপনি আবার ব্যবহার করেন ।

tr '\n' '\0' | sed ... | tr '\0' \n'

আমি নাল বাইট ব্যবহার করেছি তবে আপনি যে কোনও অক্ষর চয়ন করতে পারেন যা আপনার ইনপুট ফাইলে প্রদর্শিত হবে না।

*নিয়মিত এক্সপ্রেশনগুলির একটি বিশেষ অর্থ রয়েছে, তাই এটি \*একটি আক্ষরিক সাথে মিলের জন্য পলায়নের প্রয়োজন হবে *

.*হয় লোভী - এটা আরো অনেক কিছু সমেত দীর্ঘতম সম্ভব টেক্সট, ম্যাচ হবে */এবং /*। এর অর্থ প্রথম মন্তব্য, শেষ মন্তব্য এবং এর মধ্যের সবকিছু। এটি সীমাবদ্ধ করতে, .*আরও কঠোর প্যাটার্ন দিয়ে প্রতিস্থাপন করুন : মন্তব্যে এমন কিছু থাকতে পারে যা "" "নয় এবং" * "এর পরে" / "নয় এমন কিছুও থাকতে পারে। একাধিক *গুলি রানের জন্যও জবাবদিহি করতে হয়:

tr '\n' '\0' | sed -e 's,/\*\([^*]\|\*\+[^*/]\)*\*\+/,,g' | tr '\0' '\n'

এটি মাল্টলাইন মন্তব্যগুলিতে যে কোনও লাইনব্রেকগুলি সরিয়ে ফেলবে, যেমন।

data1 /* multiline
comment */ data2

হয়ে যাবে

data1  data2

এটি যদি না চেয়েছিল, sedতবে লাইন ব্রেকগুলির একটি রাখতে বলা যেতে পারে। এর অর্থ মিলছে এমন একটি লাইন ব্রেক ব্রেক রিপ্লেসমেন্ট চরিত্র বাছাই।

tr '\n' '\f' | sed -e 's,/\*\(\(\f\)\|[^*]\|\*\+[^*/]\)*\*\+/,\2,g' | tr '\f' '\n'

বিশেষ চরিত্র \fএবং কোনও ব্যাক-রেফারেন্সের ব্যবহার যা কোনও কিছুর সাথে মিলে না sed। (আমি নিশ্চিত করেছি যে এটি জিএনইউ সেড 7.০7 এবং ৪.২.২ এ কাজ করে))


আপনি কী দয়া করে মনকে জানান যে এটি কীভাবে কাজ করবে I আমি নীচের মত চেষ্টা করেছি। tr '। n' '\ 0' | | সেড-এর, / * ([[^ *] \ | * * \ + [^ * /]]) ** \ + /, জি 'পরীক্ষা.সাস | tr '\ 0' '\ n' এবং আমি নীচে পেয়েছি: / * এটি আউটপুট ডেটা প্রিন্ট করতে হয় * / ডেটা abcdf; সিএফজিটিআর সেট করুন; চালানো; proc মুদ্রণ তথ্য = sashelp.cars; চালানো; ডেটা এবিসি; xyz সেট; চালানো;
শারিক আলম

@ শারিকআলাম আপনি test.sasসেখানে পাইপলাইনটির মাঝখানে রেখেছেন , তাই sedসরাসরি এটি থেকে পড়ুন, এবং প্রথমটির trকোনও প্রভাব নেই। আপনার ব্যবহার করতে হবেcat test.sas | tr ...
জিগ্লিনাগা

0

মন্তব্যগুলি সরাতে একটি লাইন সেড ব্যবহার:

sed '/\/\*/d;/\*\//d' file

proc print data=sashelp.cars;
run;
data abc;
set xyz;
run;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.