টেক্সট ফাইলে কী মিলবে না বন্ধনী?


32

আজ আমি শিখেছি যে perl -c filenameপার্ল স্ক্রিপ্টগুলি অযৌক্তিকভাবে নয়, আমি নির্বিচারে ফাইলগুলিতে mat mat তুলনামূলক কোঁকড়ানো বন্ধনীগুলি ব্যবহার করতে পারি । সমস্যাটি হ'ল এটি অন্যান্য ধরণের বন্ধনী () [] [] এবং সম্ভবত <> এর সাথে কাজ করে না। আমি বেশ কয়েকটি ভিম প্লাগইনগুলির সাথেও পরীক্ষা-নিরীক্ষা করেছি যা দাবী করে তুলনামূলক বন্ধনী খুঁজে পেতে সহায়তা করে তবে এখন পর্যন্ত এতটা ভাল নয়।

আমার কাছে বেশ কয়েকটি বন্ধনী সহ একটি পাঠ্য ফাইল রয়েছে এবং তার মধ্যে একটি অনুপস্থিত রয়েছে! এমন কোন প্রোগ্রাম / স্ক্রিপ্ট / ভিআইএম প্লাগইন / যা যা আমাকে মেলে না বন্ধনী সনাক্ত করতে সহায়তা করতে পারে?

উত্তর:


22

ভিমে আপনি ব্যবহার করতে পারেন [এবং ]দ্রুত পরবর্তী কীস্ট্রোকে প্রবেশ করা প্রকারের নিকটতম মিলহীন বন্ধনীতে ভ্রমণ করতে পারেন ।

সুতরাং [{আপনাকে নিকটতম তুলনামূলক "{" এ নিয়ে যাবে; ])আপনাকে নিকটতম তুলনামুলক ")") এর আগে নিয়ে যাবে এবং আরও কিছু on


দুর্দান্ত, এটি আমার জন্য উপযুক্ত। আমি এই উত্তরটি গ্রহণ করতে চলেছি, তবে কেবল কোনও পাঠ্য প্রক্রিয়াকরণ সরঞ্জাম রয়েছে যা এটি বিশ্লেষণ করতে পারে তা দেখার জন্য অপেক্ষা করছি।
ফোনেহেহে

6
আমি আরও যোগ করব যে ভিমে আপনি% (শিফট 5, মার্কিন যুক্তরাষ্ট্রে) ব্যবহার করতে পারেন যার সাথে সাথে আপনি যা করছেন তার জন্য মেলা বন্ধনীটি খুঁজে পেতে পারেন ।
আতরুন

@ আত্রুন ওও, সুন্দর আমি এখনও এটি জানতাম না। আমি মাঝে মাঝে স্ট্যাকেক্সচেঞ্জ পছন্দ করি। :)
শাদুর

<kbd> [</kbd> এবং <kbd>] </
কেবিডি

আমি প্রায় একদিন 4000 লাইন পেরিয়ে কাটিয়েছি আর-এ অনুপস্থিত find সন্ধান করার চেষ্টা করেছিলাম এবং এটিই ছিল উত্তর। আবার, আপনাকে ভিআইএম ধন্যবাদ! তবে আমি মনে করি উত্স কোড ফাইলগুলি ছোট অংশগুলিতে বিভক্ত করার জন্য এটি একটি ভাল যুক্তি।
থমাস ব্রাউন

7

আপডেট 2:
নিম্নলিখিত স্ক্রিপ্টটি এখন কোনও অমিল বন্ধনীটির লাইন নম্বর এবং কলাম প্রিন্ট করে । এটি স্ক্যান প্রতি একটি বন্ধনী প্রকার প্রক্রিয়া করে (উদা। '[]' '<>' '{}' '()' ...)
স্ক্রিপ্টটি প্রথম , তুলনাহীন ডান বন্ধনী বা কোনও জোড় বাঁধা বাম বন্ধনী চিহ্নিত করে identif ... একটি এরো সনাক্ত করার পরে, এটি লাইন এবং কলাম সংখ্যার সাথে প্রস্থান করে

এখানে কিছু নমুনা আউটপুট ...


File = /tmp/fred/test/test.in
Pair = ()

*INFO:  Group 1 contains 1 matching pairs

ERROR: *END-OF-FILE* encountered after Bracket 7.
        A Left "(" is un-paired in Group 2.
        Group 2 has 1 un-paired Left "(".
        Group 2 begins at Bracket 3.
  see:  Line, Column (8, 10)
        ----+----1----+----2----+----3----+----4----+----5----+----6----+----7
000008  (   )    (         (         (     )   )                    

লিপিটি এখানে ...


#!/bin/bash

# Itentify the script
bname="$(basename "$0")"
# Make a work dir
wdir="/tmp/$USER/$bname"
[[ ! -d "$wdir" ]] && mkdir -p "$wdir"

# Arg1: The bracket pair 'string'
pair="$1"
# pair='[]' # test
# pair='<>' # test
# pair='{}' # test
# pair='()' # test

# Arg2: The input file to test
ifile="$2"
  # Build a test source file
  ifile="$wdir/$bname.in"
  cp /dev/null "$ifile"
  while IFS= read -r line ;do
    echo "$line" >> "$ifile"
  done <<EOF
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
[   ]    [         [         [
<   >    <         
                   <         >         
                             <    >    >         >
----+----1----+----2----+----3----+----4----+----5----+----6
{   }    {         }         }         }         } 
(   )    (         (         (     )   )                    
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
EOF

echo "File = $ifile"
# Count how many: Left, Right, and Both
left=${pair:0:1}
rght=${pair:1:1}
echo "Pair = $left$rght"
# Make a stripped-down 'skeleton' of the source file - brackets only
skel="/tmp/$USER/$bname.skel" 
cp /dev/null "$skel"
# Make a String Of Brackets file ... (It is tricky manipulating bash strings with []..
sed 's/[^'${rght}${left}']//g' "$ifile" > "$skel"
< "$skel" tr  -d '\n'  > "$skel.str"
Left=($(<"$skel.str" tr -d "$left" |wc -m -l)); LeftCt=$((${Left[1]}-${Left[0]}))
Rght=($(<"$skel.str" tr -d "$rght" |wc -m -l)); RghtCt=$((${Rght[1]}-${Rght[0]}))
yBkts=($(sed -e "s/\(.\)/ \1 /g" "$skel.str"))
BothCt=$((LeftCt+RghtCt))
eleCtB=${#yBkts[@]}
echo

if (( eleCtB != BothCt )) ; then
  echo "ERROR:  array Item Count ($eleCtB)"
  echo "     should equal BothCt ($BothCt)"
  exit 1
else
  grpIx=0            # Keep track of Groups of nested pairs
  eleIxFir[$grpIx]=0 # Ix of First Bracket in a specific Group
  eleCtL=0           # Count of Left brackets in current Group 
  eleCtR=0           # Count of Right brackets in current Group
  errIx=-1           # Ix of an element in error.
  for (( eleIx=0; eleIx < eleCtB; eleIx++ )) ; do
    if [[ "${yBkts[eleIx]}" == "$left" ]] ; then
      # Left brackets are 'okay' until proven otherwise
      ((eleCtL++)) # increment Left bracket count
    else
      ((eleCtR++)) # increment Right bracket count
      # Right brackets are 'okay' until their count exceeds that of Left brackets
      if (( eleCtR > eleCtL )) ; then
        echo
        echo "ERROR:  MIS-matching Right \"$rght\" in Group $((grpIx+1)) (at Bracket $((eleIx+1)) overall)"
        errType=$rght    
        errIx=$eleIx    
        break
      elif (( eleCtL == eleCtR )) ; then
        echo "*INFO:  Group $((grpIx+1)) contains $eleCtL matching pairs"
        # Reset the element counts, and note the first element Ix for the next group
        eleCtL=0
        eleCtR=0
        ((grpIx++))
        eleIxFir[$grpIx]=$((eleIx+1))
      fi
    fi
  done
  #
  if (( eleCtL > eleCtR )) ; then
    # Left brackets are always potentially valid (until EOF)...
    # so, this 'error' is the last element in array
    echo
    echo "ERROR: *END-OF-FILE* encountered after Bracket $eleCtB."
    echo "        A Left \"$left\" is un-paired in Group $((grpIx+1))."
    errType=$left
    unpairedCt=$((eleCtL-eleCtR))
    errIx=$((${eleIxFir[grpIx]}+unpairedCt-1))
    echo "        Group $((grpIx+1)) has $unpairedCt un-paired Left \"$left\"."
    echo "        Group $((grpIx+1)) begins at Bracket $((eleIxFir[grpIx]+1))."
  fi

  # On error, get Line and Column numbers
  if (( errIx >= 0 )) ; then
    errLNum=0    # Source Line number (current).
    eleCtSoFar=0 # Count of bracket-elements in lines processed so far.
    errItemNum=$((errIx+1)) # error Ix + 1 (ie. "1 based")
    # Read the skeketon file to find the error line-number
    while IFS= read -r skline ; do
      ((errLNum++))
      brackets="${skline//[^"${rght}${left}"]/}" # remove whitespace
      ((eleCtSoFar+=${#brackets}))
      if (( eleCtSoFar >= errItemNum )) ; then
        # We now have the error line-number
        # ..now get the relevant Source Line 
        excerpt=$(< "$ifile" tail -n +$errLNum |head -n 1)
        # Homogenize the brackets (to be all "Left"), for easy counting
        mogX="${excerpt//$rght/$left}"; mogXCt=${#mogX} # How many 'Both' brackets on the error line? 
        if [[ "$errType" == "$left" ]] ; then
          # R-Trunc from the error element [inclusive]
          ((eleTruncCt=eleCtSoFar-errItemNum+1))
          for (( ele=0; ele<eleTruncCt; ele++ )) ; do
            mogX="${mogX%"$left"*}"   # R-Trunc (Lazy)
          done
          errCNum=$((${#mogX}+1))
        else
          # errType=$rght
          mogX="${mogX%"$left"*}"   # R-Trunc (Lazy)
          errCNum=$((${#mogX}+1))
        fi
        echo "  see:  Line, Column ($errLNum, $errCNum)"
        echo "        ----+----1----+----2----+----3----+----4----+----5----+----6----+----7"  
        printf "%06d  $excerpt\n\n" $errLNum
        break
      fi
    done < "$skel"
  else
    echo "*INFO:  OK. All brackets are paired."
  fi
fi
exit

এই স্ক্রিপ্ট উজ্জ্বল!
জোনাথন ডুমাইন

1
এই সন্ত্রস্ত, কিন্তু এটা সবসময় মুদ্রণ বলে মনে হয় Line, Column (8, 10)কোন ব্যাপার যা ফাইল আমি তে এটি চেষ্টা করুন। এছাড়াও mogXCt=${#mogX}সেট করা আছে কিন্তু কোথাও ব্যবহার করা হয় না।
ক্লেটন ডিউস

5

শাদুর দ্বারা চিহ্নিত হিসাবে সেরা বিকল্পটি ভিএম / জিভিম, তবে আপনি যদি কোনও স্ক্রিপ্ট চান, আপনি স্ট্যাক ওভারফ্লোতে অনুরূপ প্রশ্নের আমার উত্তরটি পরীক্ষা করতে পারেন । আমি আমার পুরো উত্তর এখানে পুনরাবৃত্তি:

আপনি যা করতে চেষ্টা করছেন তা যদি কোনও সাধারণ উদ্দেশ্য ভাষার ক্ষেত্রে প্রযোজ্য হয়, তবে এটি একটি তুচ্ছ সমস্যা।

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

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

আপনি যে ভাষাটি পরীক্ষা করতে চান তা জানার পক্ষে সহায়ক হবে।


যদি আমি এই অনুমানটি গ্রহণ করি যে কোনও আওয়াজ নেই, অর্থাত্ সমস্ত বন্ধনী দরকারী বন্ধনী, তবে আমার কৌশলটি পুনরাবৃত্তি হবে:

আমি কেবল সমস্ত অভ্যন্তর বন্ধনী জোড়া সন্ধান করতে এবং অপসারণ করতে চাই: যেগুলির ভিতরে কোনও বন্ধনী নেই। এটি একটি দীর্ঘ দীর্ঘ লাইনে সমস্ত লাইন ভেঙে দিয়ে সবচেয়ে ভাল করা হয় (এবং লাইন রেফারেন্স যুক্ত করার জন্য কোনও পদ্ধতি অনুসন্ধান করুন, আপনার যদি সেই তথ্যটি বের করার প্রয়োজন হয়)। এই ক্ষেত্রে অনুসন্ধান এবং প্রতিস্থাপন করা বেশ সহজ:

এটির জন্য একটি অ্যারে প্রয়োজন:

B["("]=")"; B["["]="]"; B["{"]="}"

এবং এই উপাদানগুলির মাধ্যমে একটি লুপ:

for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}

আমার পরীক্ষার ফাইলটি নিম্নরূপ:

#!/bin/awk

($1 == "PID") {
  fo (i=1; i<NF; i++)
  {
    F[$i] = i
  }
}

($1 + 0) > 0 {
  count("VIRT")
  count("RES")
  count("SHR")
  count("%MEM")
}

END {
  pintf "VIRT=\t%12d\nRES=\t%12d\nSHR=\t%12d\n%%MEM=\t%5.1f%%\n", C["VIRT"], C["RES"], C["SHR"], C["%MEM"]
}

function count(c[)
{
  f=F[c];

  if ($f ~ /m$/)
  {
    $f = ($f+0) * 1024
  }

  C[c]+=($f+0)
}

আমার সম্পূর্ণ স্ক্রিপ্ট (লাইন রেফারেন্স ছাড়াই) নিম্নরূপ:

cat test-file-for-brackets.txt | \
  tr -d '\r\n' | \
  awk \
  '
    BEGIN {
      B["("]=")";
      B["["]="]";
      B["{"]="}"
    }
    {
      m=1;
      while(m>0)
      {
        m=0;
        for (b in B)
        {
          m+=gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)
        }
      };
      print
    }
  '

সেই স্ক্রিপ্টটির আউটপুট বন্ধনীগুলির অভ্যন্তরীণ অবৈধ ব্যবহারগুলিতে থামে। তবে সাবধান থাকুন: 1 / এই স্ক্রিপ্টটি মন্তব্যগুলিতে, নিয়মিত অভিব্যক্তিগুলিতে বা স্ট্রিংগুলিতে বন্ধনীর সাথে কাজ করবে না, 2 / এটি মূল ফাইলটিতে সমস্যাটি কোথায় রয়েছে তা রিপোর্ট করে না, 3 / যদিও এটি সমস্ত ভারসাম্যযুক্ত জোড়গুলি সরিয়ে ফেলবে যা এটি অন্তঃপুরে থামে ত্রুটির শর্ত এবং সমস্ত নিবন্ধ বন্ধনী রাখে।

পয়েন্ট 3 / সম্ভবত সম্ভবত একটি শোষণীয় ফলাফল, যদিও আমি মনে করি যে প্রতিবেদন করার পদ্ধতিটি সম্পর্কে আপনি নিশ্চিত নন।

পয়েন্ট 2 / বাস্তবায়িত করা তুলনামূলকভাবে সহজ তবে উত্পাদন করতে কয়েক মিনিটের বেশি সময় নেয়, সুতরাং আমি এটি আপনার কাছে রেখে দেব।

পয়েন্ট 1 / হ'ল জটিল কারণ আপনি কখনও কখনও নেস্টেড শুরু এবং শেষগুলি, বা বিশেষ অক্ষরের জন্য বিশেষ উদ্ধৃতি বিধি প্রতিযোগিতার সম্পূর্ণ নতুন ক্ষেত্র প্রবেশ করেন ...


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