المتعدد التعبير المنتظم والإخراج إلى ملف في ويندوز

StackOverflow https://stackoverflow.com/questions/572110

  •  05-09-2019
  •  | 
  •  

سؤال

لدي ملف سجل أحتاج لاستخراج أنماط محددة من. أحتاج إلى العثور عليها ثم معالجةها في ملف جديد. عادة ما تفعل GREP على لينكس الخدعة ولكن التعبير العادي يمتد خطوط متعددة، التي أفهمها لا تفعلها Grep.

هنا مثال من ملف السجل / التصحيح الخاص بي:


Da:
1.328   0.5045  

Db:
0.6415  0.1192  

Lambda:
0.4429  -0.35   
-0.0461 -0.02421    

seps:
0.714272

أبحث عن /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/ أريد بعد ذلك إخراج الخطوط إلى ملف جديد إزالة Lambda وإعادة ترتيب الأرقام الموجودة على نفس الخط حتى الإخراج \1\s\2\s\3\s\4\n

لذلك لدي بالفعل سؤالان:

  1. هل هناك فائدة سهلة لإنجاز هذا، على أي نظام؟
  2. هل هناك طريقة للقيام بذلك على وجه التحديد على ويندوز؟

آمل أن يكون هناك حل بسيط لهذا هربني. أفضل أن أبقى في ويندوز ولكن إذا اضطررت إلى الذهاب إلى لينكس سأحصل على ذلك.

هل كانت مفيدة؟

المحلول 3

شكرا لجميع الإجابات. أحب الإجابات التي أعطيتها لي في بيرل و AWK. أنا واحد من هؤلاء المبرمجين الغريب الذين لا يعرفون بيرل، لذلك أخذت طريق روبي. ها هو الحل الخاص بي

x=ARGV[0]
f=File.new(ARGV[1])
g=File.new(ARGV[2],"w")
f.read.gsub(/#{x}:\s*(([\d\.\-]*\t*)+\n)+/ ){|entry|
    puts entry
    g.puts entry.gsub(/#{x}:\n/,'').gsub(/\s+/,"\t").strip
}

هذا يمكنني استخدامه كأداة مساعدة مع محرر My Notepad ++ من خلال NPPEXEC، والذي لا يدعم إعادة التوجيه والأنابيب، بقدر ما أعرف. هذا يسمح لي أيضا بجمع أي من الناتج الذي أحتاجه لتشخيصه حسب البرنامج. شكرا مرة أخرى y'all.

نصائح أخرى

هذا مرشح جيد ل awk, perl وما شابه ذلك تحليلات دعائية (سيتم تشغيل هذه في كل من Windows CMD.EXE, ، شريطة أن يكون لديك perl و / أو awk/sed في الخاص بك PATH, ، وكذلك، بالطبع، على نظام Linux وغيرها من أيه):

awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file

أو

perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file >output_file


يمكنك إجراء تمريرة ثانية لتطبيع Whitespace (وتقليم مساحة بيضاء في نهاية الخطوط) إذا لزم الأمر.

awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file| sed -e "s: *: :g" -e "s: *$::" >output_file

أو

perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file| perl -ne "s/ +/ /g; s/ +$//g; print" >output_file

يمكنك تثبيت Perl أو Python أو Ruby أو PHP واكتب البرنامج النصي بسهولة إلى حد ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top