المتعدد التعبير المنتظم والإخراج إلى ملف في ويندوز
سؤال
لدي ملف سجل أحتاج لاستخراج أنماط محددة من. أحتاج إلى العثور عليها ثم معالجةها في ملف جديد. عادة ما تفعل 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
لذلك لدي بالفعل سؤالان:
- هل هناك فائدة سهلة لإنجاز هذا، على أي نظام؟
- هل هناك طريقة للقيام بذلك على وجه التحديد على ويندوز؟
آمل أن يكون هناك حل بسيط لهذا هربني. أفضل أن أبقى في ويندوز ولكن إذا اضطررت إلى الذهاب إلى لينكس سأحصل على ذلك.
المحلول 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 واكتب البرنامج النصي بسهولة إلى حد ما.