Windows Command til at opdage og fjerne tekst i en fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en ASCII-fil, og der er et sted der er linjen:
BEGYNDE
og senere på linjen:
ENDE


Jeg vil gerne kunne fjerne disse to linjer og alt imellem fra et kommandolinjeopkald i Windows. Dette skal være helt automatiseret.


EDIT: Se sed i Vista - hvordan man sletter alle symboler mellem? for detaljer om hvordan man bruger sed til at gøre dette (cygwin har sed).


EDIT: Jeg finder ud af at SED kunne fungere, men når jeg rør udgangen til en fil, er vognreturen blevet fjernet. Hvordan kan jeg beholde disse? Brug denne sed regex:


/^ GlobalSection (TeamFoundationVersionControl)=preSolution $/,/^ EndGlobalSection $/{
 /^ GlobalSection (TeamFoundationVersionControl)=preSolution $/! {
 /^ EndGlobalSection $/! D
 }
 }


.. hvor startafsnittet er 'GlobalSection (TeamFoundationVersionControl)=preSolution' og slutafsnittet er 'EndGlobalSection'. Jeg vil også gerne slette disse linjer også.


EDIT: Jeg bruger nu noget, der er enklere for sed:


/^ GlobalSection (TeamFoundationVersionControl)=preSolution $/,/^ EndGlobalSection $/d


Linjens feeds er dog stadig et problem

Bedste reference


Alternativt, hvad jeg bruger i disse dage er et script sprog, der spiller pænt med windows som Ruby eller Python til sådanne opgaver. Ruby er let at installere i Windows og giver problemer som dette barns spil.


Her er et script, du kan bruge som:
cutBeginEnd.rb myFileName.txt


sourcefile = File.open(ARGV[0])

# Get the string and do a multiline replace
fileString = sourceFile.read()
slicedString = fileString.gsub(/BEGIN.*END
/m,"") 

#Overwrite the file
sourcefile.pos = 0                
sourcefile.print slicedString             
sourcefile.truncate(f.pos)  


Dette gør et ret godt arbejde, giver mulighed for en masse fleksibilitet og er muligvis mere læselig end sed.

Andre referencer 1


Her er en 1-linje Perl-kommando, der gør hvad du vil (skriv bare det fra kommandopromptvinduet):


perl -i.bak -ne "print unless /^BEGIN
?
/ .. /^END
?
/" myfile.txt


Vognretur og linjefeeds vil blive bevaret korrekt. Den oprindelige version af myfile.txt gemmes som myfile.txt.bak.


Hvis du ikke har installeret Perl, skal du få ActivePerl. [7]

Andre referencer 2


Sådan sletter du hele GlobalSection (TeamFoundationVersionControl)=preSolution sektionen ved hjælp af et C # regulært udtryk:


// Create a regex to match against an entire GlobalSection(TeamFoundationVersionControl) section so that it can be removed (including preceding and trailing whitespace).
// The symbols *, +, and ? are greedy by default and will match everything until the LAST occurrence of EndGlobalSection, so we must use their non-greedy counterparts, *?, +?, and ??.
// Example of string to match against: "    GlobalSection(TeamFoundationVersionControl) ...... EndGlobalSection     "
Regex \_regex = new Regex(@"(?i:s*?GlobalSection(TeamFoundationVersionControl)(?:.|
)*?EndGlobalSections*?)", RegexOptions.Compiled);