শেষ অবধি ম্যাচের পরে গ্রেপ লাইন


12

আমার থেকে নিম্নলিখিতগুলি আউটপুট রয়েছে git status, আমি কীভাবে grepপরে যাব Untracked files:

[alexus@wcmisdlin02 Test]$ git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   app/.gitignore
#   new file:   app/app.iml
#   new file:   app/build.gradle
#   new file:   app/proguard-rules.pro
#   new file:   app/src/androidTest/java/org/alexus/test/ApplicationTest.java
#   new file:   app/src/main/AndroidManifest.xml
#   new file:   app/src/main/java/org/alexus/test/MainActivity.java
#   new file:   app/src/main/res/layout/activity_main.xml
#   new file:   app/src/main/res/menu/menu_main.xml
#   new file:   app/src/main/res/mipmap-hdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-mdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-xhdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-xxhdpi/ic_launcher.png
#   new file:   app/src/main/res/values-w820dp/dimens.xml
#   new file:   app/src/main/res/values/dimens.xml
#   new file:   app/src/main/res/values/strings.xml
#   new file:   app/src/main/res/values/styles.xml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   .gitignore
#   .idea/
#   Test.iml
#   build.gradle
#   gradle.properties
#   gradle/
#   gradlew
#   gradlew.bat
#   settings.gradle
[alexus@wcmisdlin02 Test]$ 

এটি পছন্দ করুন তবে জিএনইউতে -Aপ্যারামিটারের মতো লাইন সংখ্যা উল্লেখ না করে grep:

[alexus@wcmisdlin02 Test]$ git status | grep -A100 'Untracked files'
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   .gitignore
#   .idea/
#   Test.iml
#   build.gradle
#   gradle.properties
#   gradle/
#   gradlew
#   gradlew.bat
#   settings.gradle
[alexus@wcmisdlin02 Test]$ 

এটি করার কোন উপায় আছে?

[alexus@wcmisdlin02 Test]$ grep --version
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
[alexus@wcmisdlin02 Test]$ 

আপনি -Aযুক্তি হিসাবে একটি বড় সংখ্যক সংখ্যার সাথে কেন ব্যবহার করতে পারবেন না ?
ক্যাস্পার্ড

উত্তর:


17

জিএনইউ সহ grep(সংস্করণ ২. version.৩ সহ পরীক্ষিত):

git status | grep -Pzo '.*Untracked files(.*\n)*'

ব্যবহার -PPerl রেগুলার এক্সপ্রেশনের জন্য, -zসাথে সম্পর্কে newline মেলে \nএবং -oকেবল ধরণের সাথে মেলা প্রিন্ট করতে।

রেজেক্স ব্যাখ্যা করেছেন :

প্রথমে আমরা কোনও বর্ণ ( .) শূন্য বা একাধিকবার ( *) স্ট্রিংয়ের উপস্থিতি অবধি মিলিত করি Untracked files। এখন, বন্ধনীগুলির ভিতরে থাকা অংশটি (.*\n)একটি নতুন লাইন ( .) শূন্য বা একাধিকবার ( *) এর পরে একটি নতুন লাইন ( \n) এর পরে কোনও অক্ষরের সাথে মেলে । এবং যা কিছু (এটি ব্যাকটের ভিতরে রয়েছে) শূন্য বা একাধিকবার ঘটতে পারে; এটিই শেষের অর্থ *। এটি এখন প্রথম ঘটনার পরে অন্য সমস্ত লাইনের সাথে মিলিয়ে নেওয়া উচিত Untracked files


3
একটি উত্তর যা আসলে ব্যবহার করে grep, আমি মুগ্ধ!
হিপ্পি

@ হিপ্পি আমাকেও) এবং তারপরে আবার
ম্যাচটিও

1
যদি ইনপুটটিতে প্রচুর লাইন থাকে তবে এটি ভাল কাজ করে না। আমি এটি উবুন্টু ১৪.০৪ এ পরীক্ষা করেছি এবং যদি ম্যাচটি প্রায় ৮০০০ লাইনের চেয়ে দীর্ঘ হয় তবে এটি সেগফোল্ট হয়।
ক্যাস্পার্ড

2
@ ক্যাস্পার্ড আমি মনে করি 8000+ লাইনের grepসাহায্যে সঠিক সরঞ্জাম নয়। তবে অন্যথায় এই প্রশ্নটি (আমার মনে হয়) কেবলমাত্র প্রাসঙ্গিক আউটপুটটি দেখার জন্য, আপনার স্পষ্টতই 8000+ লাইনে কী নেই, grepএড বা নেই।
বিশৃঙ্খলা

1
@ চাওস আমি grep -A999999999 'Untracked files'ম্যাচের আগে 1000000 লাইন এবং ম্যাচের পরে 1000000 লাইনের সাথেও পরীক্ষা করেছি । এই পদ্ধতির ঠিক কাজ করে। সুতরাং grepএটি করতে পারেন। আপনার পদ্ধতির সমস্যাটি হ'ল আপনি পৃথক লাইনের পরিবর্তে সম্পূর্ণ ফাইলে একক ম্যাচ করতে বাধ্য করছেন।
ক্যাস্পার্ড

13

আপনি যদি সেড ব্যবহার করতে আপত্তি না করেন তবে এখানে একটি সম্ভাব্য সমাধান রয়েছে

git status | sed -n -e '/Untracked files/,$p'

এটির সুবিধাটি রয়েছে যে এটি প্লেইন ইউনিক্স গ্রেপ এবং সেডের সাথে কাজ করে, যখন গ্রহণযোগ্য সমাধানটির জন্য জিএনইউ গ্রেপ প্রয়োজন।
গুন্টরাম ব্লহম

3

আমি এটির awkজন্য ব্যবহার করব :

git status | awk '/Untracked files/,0'

এটি /Untracked files/,0একটি পরিসীমা এক্সপ্রেশন। এটি প্রথম থেকে সত্যকে এবং সত্য Untracked filesপর্যন্ত 0মূল্যায়ন না করা পর্যন্ত মূল্যায়ন করে। যেহেতু এটি কখনই ঘটে না, এটি বাকী ফাইলটি মুদ্রণ করে।

মনে রাখবেন যে awkসত্যের প্রতি ব্যবহারকারীর আচরণ হ'ল বর্তমান রেকর্ডটি (সাধারণত রেখাটি) মুদ্রণ করা, এজন্য আমাদের স্পষ্টভাবে কল করতে হবে না print


2

আপনি চেষ্টা করতে পারেন:

git status | grep -A99 Untracked

যেখানে -Aম্যাচের পরে চলার প্রসঙ্গে লাইনের মুদ্রণ হবে।

বিকল্পভাবে ব্যবহার করুন moreবা lessউদাহরণস্বরূপ:

git status | less +/Untracked

উদ্দেশ্য scripting জন্য, আমি ব্যবহার করতে চাই ex/ vi:

git status | ex -s +"/Untracked/norm d1G" +%p -cq! /dev/stdin

আনট্র্যাকড ফাইলগুলির সাথে লাইন অন্তর্ভুক্ত করতে kd1Gপরিবর্তে ব্যবহার করুন d1G

অথবা বংশীধ্বনিতুল্য এবং ছাড়া /dev/stdin, সিনট্যাক্স হবে: ex ... <(git status)


আমি -Aআমার মূল প্রশ্নে অন্তর্ভুক্ত করেছি, তবে আমি more +/Untrackedআপনার উত্তরের অংশের মতো করি ।
অ্যালেক্সাস

@alexus আপনি একটি স্ক্রিপ্ট লেখার তবে আমি সংস্করণের সাথে যুক্ত করেছি exযা সমতূল্য vi -e
কেনারব

আপনাকে ধন্যবাদ, আমি বিশ্বাস করি more/ lessখুব দরকারী)
আলেক্সাস

1

প্রথম বন্ধনী সহ একটি লাইনারের জন্য একটি সাব-শেল স্প্যান করতে হবে যাতে আপনি ভেরিয়েবলগুলি ধরে রাখতে পারবেন না:

(while read LINE ; do [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1 ; \
   [[ "$MATCHED" = 1 ]] && echo "$LINE" ; done < <(git status))

এটির শেষে আপনাকে যা করতে হবে তা আপনি কেবল পাইপ করতে পারেন।

অথবা আপনি এটি যে কোনও শেল স্ক্রিপ্টে ব্যবহার করতে পারেন

while read LINE ; do
    [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1
    [[ "$MATCHED" = 1 ]] && echo "$LINE"
done < <(git status)

echo "$LINE"আপনি ডেটা দিয়ে যা করতে চান তা দিয়ে প্রতিস্থাপন করুন । যদি আপনি "অবরুদ্ধ ফাইলগুলি" লাইনটি এড়িয়ে যেতে চান তবে কেবল দুটি পরীক্ষা স্যুইচ করুন।


0

আপনি এটির মতো কিছু ব্যবহার করতে পারেন, আমি পার্ল ব্যবহার করেছি, আমি count = 1বর্তমান লাইনে কিছু স্ট্রিংয়ের সাথে মেলে নীচের কমান্ডটি সেট করেছি এবং যখন লুপটি শেষ হয় আমি গণনা ভেরিয়েবলগুলি পরীক্ষা করি এবং আমি লাইনগুলির রেঞ্জটি মুদ্রণ করি যেখানে শেষের সাথে ম্যাচটি ঘটে I লাইন

ls -al | perl -e '@LINES = (); $n = 0 ; $nline = 0; while(<>){ push(@LINES, $_); $n++; if($_ =~ m/mirror/i) { $count = 1; $nline = $. - 1 };};  if($count != 0){ foreach $i($nline..$n-1){ print "\t$LINES[$i]\n";}}'

1
অনেক জটিল। একটি সাধারণ পার্ল সমাধান এখানে: stackoverflow.com/a/18167194/111036 । একটি পরিবর্তন যেখানে ম্যাচে লাইন অন্তর্ভুক্ত হতে পারে:perl -ne 'print if /Untracked files:/ .. 0'
mivk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.