একটি ফাইল থেকে একাধিক ফাঁকা লাইন কীভাবে সরিয়ে ফেলবেন?


14

আমার কিছু টেক্সট-ফাইল রয়েছে যা আমি নোটগুলি নিতে ব্যবহার করি - কেবল সরল পাঠ্য, সাধারণত ব্যবহার করা হয় cat >> file। মাঝে মাঝে আমি একটি নতুন বিষয় / চিন্তার রেখা নির্দিষ্ট করতে একটি ফাঁকা রেখা বা দুটি (সবেমাত্র ফিরে আসা - নতুন লাইন চরিত্র) ব্যবহার করি। প্রতিটি সেশনের শেষে, Ctrl+ দিয়ে ফাইলটি বন্ধ করার আগে D, আমি সাধারণত সেশনগুলি আলাদা করার জন্য প্রচুর (5-10) ফাঁকা লাইন (রিটার্ন-কী) যুক্ত করি।

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

কেস # 1: আমার যা দরকার তা হ'ল একটি স্ক্রিপ্ট / কমান্ড যা পরপর দুটি (3 বা ততোধিক) বেশি ফাঁকা রেখা সরিয়ে ফেলবে এবং কেবল দুটি ফাঁকা রেখা দিয়ে তাদের প্রতিস্থাপন করবে। যদিও এটি একসাথে একের বেশি লাইন (২ বা ততোধিক) সরানোর জন্য এবং / অথবা কেবল এক ফাঁকা রেখার সাথে একাধিক ফাঁকা রেখা প্রতিস্থাপন করতে টুইঙ্ক করা যেতে পারে তবে এটি দুর্দান্ত।

কেস # 2: আমি এমন একটি স্ক্রিপ্ট / কমান্ডও ব্যবহার করতে পারি যা পাঠ্য দুটি লাইনের মধ্যবর্তী একক ফাঁকা রেখা সরিয়ে ফেলতে পারে , তবে একাধিক ফাঁকা রেখা রেখে দেয় (যদিও ফাঁকা রেখাগুলির একটি অপসারণও গ্রহণযোগ্য হবে)।



2
@ l0b0, একটি সম্পূর্ণ ভিন্ন প্রশ্ন পুরাপুরি যে (অন্যান্য একজন ছিল vimএক, এবং সঙ্গে ফাঁকা রেখা প্রতিস্থাপন ছিল এক ফাঁকা লাইন)।
স্টাফেন চেজেলাস

উত্তর:


14

মামলা 1:

awk '!NF {if (++n <= 2) print; next}; {n=0;print}'

কেস 2:

awk '!NF {s = s $0 "\n"; n++; next}
     {if (n>1) printf "%s", s; n=0; s=""; print}
     END {if (n>1) printf "%s", s}'

শেডের পরিবর্তে অজানা জন্য +1
রব

যেহেতু এই ব্যবহারের ক্ষেত্রে ঘন ঘন পুনরাবৃত্তি হয়, তাই আমি একটি স্ক্রিপ্ট তৈরি করার পরামর্শ দেব।
চককট্রিল

15

আপনি uniqফাঁকা রেখার একাধিক উদাহরণকে একটি ফাঁকা রেখায় ভেঙে ফেলার জন্য ব্যবহার করতে পারেন তবে এটি একই সাথে এবং একে অপরের নীচে থাকলে পাঠ্য ধারণ করে এমন লাইনগুলিও ধসে পড়বে।


6

মামলা 1:

perl -i -ane '$n=(@F==0) ? $n+1 : 0; print if $n<=2'

কেস 2:

perl -i -ane '$n=(@F==0) ? $n+1 : 0; print $n==2 ? "\n$_" : $n==1 ? "" : $_ '

+1 পার্ল ফিট! আওক (সম্ভবত) এর জন্য প্রচলিত, কিন্তু (ডিআরওয়াই) আমাকে ব্যবহারের ক্ষেত্রে স্ক্রিপ্টগুলি লিখতে বাধ্য করে যা এই জাতীয় পুনরাবৃত্তি হয়।
চককট্রিল

3

আপনি জিএনইউ সিডের সাথে কেস # 1 এর মতো ঠিকানা করতে পারেন:

sed -r ':a; /^\s*$/ {N;ba}; s/( *\n *){2,}/\n\n/'

এটি হল, প্যাটার্ন স্পেসে খালি লাইনগুলি সংগ্রহ করুন এবং যদি তিন বা ততোধিক লাইন থাকে তবে এটি দুটি লাইনে হ্রাস করুন।

কেস # 2 এর মতো একক ব্যবধানযুক্ত লাইনে যোগদান করতে আপনি এটি এটি করতে পারেন:

sed -r '/^ *\S/!b; N; /\n *$/!b; N; /\S *$/!b; s/\n *\n/\n/'

বা মন্তব্য আকারে:

sed -r '
  /^ *\S/!b        # non-empty line
  N                # 
  /\n *$/!b        # followed by empty line
  N                # 
  /\S *$/!b        # non-empty line
  s/\n *\n/\n/     # remove the empty line
'

1

এই সমাধানটি ফাইলের শেষ ফাঁকা রেখাগুলিরও যত্ন নেয়:

sed -r -n '
  /^ *$/!{p;b}  # non-blank line - print and next cycle
  h             # blank line - save it in hold space
  :loop
  $b end        # last line - go to end
  n             # read next line in pattern space
  /^ *$/b loop  # blank line - loop to next one
  :end          # pattern space has non-blank line or last blank line
  /^ *$/{p;b}   # last blank line: print and exit
  H;x;p         # non-blank line: print hold + pattern space and next cycle
'

0

অনুসরণ করছেন Anthon এর প্রস্তাবনা "uniq" ব্যবহার করতে ...

নেতৃস্থানীয়, অনুসরণ এবং খালি লাইনগুলি সদৃশ।

# Get large random string.
rand_str=; while [[ ${#rand_str} -lt 40 ]]; do rand_str=$rand_str$RANDOM; done

# Add extra lines at beginning and end of stdin.
(echo $rand_str; cat; echo $rand_str) |

# Convert empty lines to random strings.
sed "s/^$/$rand_str/" |

# Remove duplicate lines.
uniq |

# Remove first and last line.
sed '1d;$d' |

# Convert random strings to empty lines.
sed "s/$rand_str//"

এক দীর্ঘ লাইনে:

(rand_str=; while [[ ${#rand_str} -lt 40 ]]; do rand_str=$rand_str$RANDOM; done; (echo $rand_str; cat; echo $rand_str) | sed "s/^$/$rand_str/" | uniq | sed '1d;$d' | sed "s/$rand_str//")

অথবা কেবল "বিড়াল-এস" ব্যবহার করুন।

আমি মনে করি বর্তমান শেল প্রসঙ্গে যা আমি আরও দক্ষ বলে ধরেছি তা ধরে রাখতে আমি প্রথম বন্ধনী থেকে কোঁকড়া ধনুর্বন্ধনী থেকে পরিবর্তন করেছি । নোট করুন যে কোঁকড়া ধনুর্বন্ধনী শেষ কমান্ড পরে সেমিকোলন প্রয়োজন এবং পৃথক করার জন্য একটি স্থান প্রয়োজন।

# Add extra blank lines at beginning and end.
# These will be removed in final step.
{ echo; cat; echo; } |

# Replace multiple blank lines with a single blank line.
cat -s |

# Remove first and last line.
sed '1d;$d'

একটি লাইনে।

{ { echo; cat; echo; } | cat -s | sed '1d;$d'; }

0

পোস্ট সমাধানগুলি আমার কাছে কিছুটা রহস্যজনক লাগছিল। পাইথন ৩.6 এ সমাধানটি এখানে দেওয়া হয়েছে:

#!/usr/bin/env python3

from pathlib import Path                                                                                                                                                              
import sys                                                                                                                                                                            
import fileinput                                                                                                                                                                      


def remove_multiple_blank_lines_from_file(path, strip_right=True): 
    non_blank_lines_out_of_two_last_lines = [True, True] 
    for line in fileinput.input(str(path), inplace=True): 
        non_blank_lines_out_of_two_last_lines.pop(0) 
        non_blank_lines_out_of_two_last_lines.append(bool(line.strip())) 
        if sum(non_blank_lines_out_of_two_last_lines) > 0: 
            line_to_write = line.rstrip() + '\n' if strip_right else line 
            sys.stdout.write(line_to_write)


def remove_multiple_blank_lines_by_glob(rglob='*', path=Path('.'), strip_right=True): 
    for p in path.rglob(rglob): 
        if p.is_file(): 
            try:
                remove_multiple_blank_lines_from_file(p, strip_right=strip_right)
            except Exception as e:
                print(f"File '{p}' was not processed due the error: {e}")


if __name__ == '__main__':
    remove_multiple_blank_lines_by_glob(sys.argv[1], Path(sys.argv[2]), next(iter(sys.argv[3:]), None) == '--strip-right')

আপনি কোনও দোভাষী থেকে ফাংশনগুলি কল করতে পারেন বা শেল থেকে এটি চালাতে পারেন:

$ ./remove_multiple_lines.py '*' /tmp/ --strip-right
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.