Question

J'ai un fichier bat que je devrais utiliser pour supprimer une partie d'un fichier et l'enregistrer dans un autre. Je dois supprimer tous les symboles entre le texte & "; [Aaa bbb] &"; et & "; [ccc ddd] &" ;. Si j’ai le texte:

[aaa bbb]
1
2
3
[ccc ddd]

J'aurais comme sortie:

[aaa bbb]
[ccc ddd]

Merci

EDIT: je voudrais clarifier la question. Je devrais supprimer tous les symboles entre marker1 et marker2. Marker1 et marker2 ne sont que quelques mots ou parties de texte mais pas des lignes obligatoires. Par exemple, j'aurais:

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

Si je veux supprimer le texte entre [aaa bbb] et [www yyy], je devrais avoir en sortie:

[aaa bbb] 
[www yyy]
Était-ce utile?

La solution

Jetez un coup d’œil à la section & "Supprimer entre le marqueur 1 et le marqueur2 &"; sur cette page d'indices Sed

Appliquez-le sur votre exemple. clean.sed :

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

Exécuter en utilisant:

sed -f clean.sed inputfile.txt

Pour éditer le fichier d'entrée & "à la place &", utilisez l'option -i pour créer:

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

Une copie de sauvegarde du fichier portant le nom " datafile.txt.bak " est enregistré avant de modifier l'original.

EDIT: Puisque l’hypothèse que les marqueurs étaient toujours sur une ligne était fausse, voici un script qui peut gérer les marqueurs au milieu d’une ligne:

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

Pour cette entrée:

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

Il produit:

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

Remarque! Il ne peut pas gérer les fichiers dans lesquels les marqueurs peuvent apparaître sur la même ligne.

MODIFIER à nouveau: si le format de saisie du marqueur 1 est tel que vous pouvez toujours compter sur sa propre ligne, vous pouvez en simplifier le script:

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

(Ancrer le marqueur 1 au début et à la fin d'une ligne et ignorer le rognage de la ligne du marqueur 1).

Autres conseils

Notez que sed est disponible pour Windows, avec un ensemble d'autres utilitaires GNU. Je ne sais pas si vous demandez s'il existe un équivalent, ou comment le faire une fois que vous avez l'outil.

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


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

J'ai regardé cmd et power shell - je ne trouve rien d’utile. Obtenez-vous ActivePerl?

Si vous faites confiance au script VB &, "sed-like &"; de cette réponse ...

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

Vous pouvez taper
cscript /Nologo sed.vbs s/^\d+\s*$/ < in.txt (In.txt étant votre texte initial)

et vous obtiendrez le résultat attendu ...

^\d+\s*$

Ciblerait n'importe quelle ligne commençant par un ou plusieurs chiffres, suivie de 0 ou plusieurs espaces dans une ligne.

Ce n'est pas le meilleur & "; pur sed &"; solution et il ne peut pas réellement supprimer les lignes, mais il s’agit d’un & "; conforme à Vista &"; solution ...

En fait, le hack suivant interprétant délibérément la " d commande sed " pourrait être en mesure de "supprimer" les lignes:

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

<=> produirait en réalité:

[aaa bbb]
[ccc ddd]

Dans un fichier .bat, vous pouvez avoir un fichier sed.bat:

cscript /Nologo sed.vbs %1 < %2

puis exécutez ce .bat comme ceci:

C:\prog\sed>sed.bat s/^\d+\s*$/d in.txt
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top