sed في فيستا - كيفية حذف جميع الرموز بين ؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

لدي bat أن حذف جزء من ملف واحد و حفظ إلى واحد آخر.لا تحتاج إلى حذف جميع الرموز بين النص "[aaa bbb]" و "[ccc ddd]".هذا إذا كان لدي النص:

[aaa bbb]
1
2
3
[ccc ddd]

يجب أن يكون الناتج:

[aaa bbb]
[ccc ddd]

شكرا لك

تحرير: أود أن أوضح مسألة.يجب حذف جميع الرموز بين marker1 و marker2.Marker1 و marker2 هي فقط بعض الكلمات أو أجزاء من النص ولكن ليس واجبا خطوط.على سبيل المثال كنت قد:

[aaa bbb] [ccc]
1
2
3
4
5
[www yyy]

إذا كنت ترغب في حذف النص بين [aaa bbb] و [www yyy] يجب أن يكون الناتج:

[aaa bbb] 
[www yyy]
هل كانت مفيدة؟

المحلول

نلقي نظرة على قسم "حذف بين العلامة 1 و marker2" على هذا sed تلميحات الصفحة

بتطبيق ذلك على المثال الخاص بك. نظيفة.sed:

/^\[aaa bbb\]$/,/^\[ccc ddd\]$/{
 /^\[aaa bbb\]$/!{
   /^\[ccc ddd\]$/!d
 }
}

تشغيل باستخدام:

sed -f clean.sed inputfile.txt

تحرير ملف الإدخال "في مكان" ، استخدم الخيار-i إلى sed:

sed -i.bak -f clean.sed datafile.txt

نسخة احتياطية من الملف مع اسم "datafile.txt.باك" يتم حفظها قبل تحرير الأصلي.

تحرير:منذ افتراض أن علامات حيث دائما على خط خاص بهم كان خطأ ، هيريس النصي التي يمكن التعامل مع العلامات في منتصف الخط:

/\[aaa bbb\]/,/\[ccc ddd\]/{
  s/\[aaa bbb\].*/[aaa bbb]/
  s/.*\[ccc ddd\]/[ccc ddd]/
  /\[aaa bbb\]$/!{
    /^\[ccc ddd\]/!d
  }
}

هذا الإدخال:

foo[aaa bbb]1
2
3
4
5[ccc ddd]bar
foo
[aaa bbb]
1
2
3
[ccc ddd]
bar

وتنتج:

foo[aaa bbb]
[ccc ddd]bar
foo
[aaa bbb]
[ccc ddd]
bar

ملاحظة! ذلك لا يمكن التعامل مع الملفات حيث يمكن علامات تظهر على نفس الخط.

تحرير مرة أخرى: إذا كان الإدخال شكل علامة 1 هي تلك التي يمكنك دائما الاعتماد على كونها على خط من تلقاء نفسها يمكنك تبسيط النص بعض:

/^\[aaa bbb\]$/,/\[ccc ddd\]/{
  s/.*\[ccc ddd\]/[ccc ddd]/
  /^\[aaa bbb\]$/!{
    /^\[ccc ddd\]/!d
  }
}

(ترسيخ علامة 1 في بداية ونهاية خط تخطي التشذيب من علامة 1 خط.)

نصائح أخرى

علما بأن sed تتوفر على نظام ويندوز ، جنبا إلى جنب مع مجموعة كاملة الأخرى جنو المرافق.لست متأكدا إن كنت تسأل عما إذا كان هناك ما يعادلها ، أو كيفية في الواقع تفعل ذلك مرة واحدة كنت قد حصلت على الأداة.

D:\tmp\sed.exe -f sedscript.sed D:\tmp\test.txt >c:\tmp\test2.txt


/^\[Product Feature\]$/,/^\[Dm$/{
 /^\[Product Feature\]$/!{
 /^\[Dm$/!d 
 }
 } 

نظرت cmd في شل السلطة - لا يمكن العثور على أي شيء مفيد.الحصول على نفسك ActivePerl?

إذا كنت تثق VB "sed-مثل" من هذا الجواب...

sed.vbs:

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  WScript.Echo rxp.Replace(inp, patparts(2))
Loop

يمكنك كتابة
cscript /Nologo sed.vbs s/^\d+\s*$/ < in.txt (in.txt أن النص الأولي)

و سوف تحصل على النتيجة المتوقعة...

^\d+\s*$

أن الهدف من أي خط بداية مع واحد أو أكثر من أرقام ، تليها 0 أو أكثر المساحات في خط واحد.


ليس هذا هو أفضل "نقية sed" الحل لا يمكن في الواقع حذف خطوط, ولكن هذا هو الأصلي "ويندوز فيستا متوافقة مع" الحل...


في الحقيقة التالية هاك عمدا تفسير "d sed-الأمر" يمكن أن تكون قادرة على 'حذف' خطوط:

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  out = rxp.Replace(inp, patparts(2))
  if not patparts(2)="d" or not out="d" Then
    WScript.Echo out
  end if
Loop

cscript /Nologo sed.vbs s/^\d+\s*$/ < in.txt أن تنتج في الواقع:

[aaa bbb]
[ccc ddd]

في .bat, هل يمكن أن يكون sed.bat:

cscript /Nologo sed.vbs %1 < %2

ومن ثم تنفيذ ذلك .مضرب مثل هذا:

C:\prog\sed>sed.bat s/^\d+\s*$/d in.txt
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top