2 votes

Regex avec PowerShell ne fonctionne pas avec /n (nouvelle ligne)

Pour une raison quelconque, les caractères de nouvelle ligne ne fonctionnent pas avec ma regex.

Voici la première partie du script PowerShell. Ce morceau de code est utilisé pour obtenir un ensemble de fichiers markdown. À des fins de test, je n'utilise que le premier fichier.

Le code récupère ensuite le contenu du fichier.

$path = 'C:\Users\Will\Desktop\ProjectTemp'

$filelist = ls $path -filter *.md -recurse

[string[]]$currentfile_path = $filelist[0].FullName

$currentfile_data = Get-Content $currentfile_path

C'est le code qui pose problème. Il fonctionne bien partout ailleurs, mais PowerShell ne trouve pas les correspondances pour les remplacer. Plus précisément, j'ai constaté que les caractères de nouvelle ligne ne fonctionnent pas. Rien de ce que j'ai essayé ne fonctionne.

$currentfile_data -Replace '([ \t]*)\| (.*) \| (.*) \| (.*) \|\r\n[ \t]*\| .* \| .* \| .* \|\r\n[ \t]*\| (.*) \| (.*) \| (.*) \|','$1<table>\n$1\t<tr align="center" valign="middle">\n$1\t\t<th>$2</th>\n$1\t\t<th>$3</th>\n$1\t\t<th>$4</th>\n$1\t</tr>\n$1\t<tr align="center" valign="middle">\n$1\t\t<td>$5</td>\n$1\t\t<td>$6</td>\n$1\t\t<td>$7</td>\n$1\t</tr>\n$1</table>'

Ceci est destiné à trouver la regex : '([ \t]*)\| (.*) \| (.*) \| (.*) \|\r\n[ \t]*\| .* \| .* \| .* \|\r\n[ \t]*\| (.*) \| (.*) \| (.*) \|'

et le remplacer par :

$1<table>\n$1\t<tr align="center" valign="middle">\n$1\t\t<th>$2</th>\n$1\t\t<th>$3</th>\n$1\t\t<th>$4</th>\n$1\t</tr>\n$1\t<tr align="center" valign="middle">\n$1\t\t<td>$5</td>\n$1\t\t<td>$6</td>\n$1\t\t<td>$7</td>\n$1\t</tr>\n$1</table>'

A quoi doivent ressembler les entrées et les sorties :

| th1 | th2 | th3 |
| :-: | :-: | :-: |
| td1 | td2 | td3 |

<table>
    <tr align="center" valign="middle">
        <th>th1</th>
        <th>th2</th>
        <th>th3</th>
    </tr>
    <tr align="center" valign="middle">
        <td>td1</td>
        <td>td2</td>
        <td>td3</td>
    </tr>
</table>

Y a-t-il un moyen d'y remédier ? Est-ce que je fais quelque chose de mal ?

3voto

mklement0 Points 12597

en résumé

$currentfile_data = Get-Content -Raw $currentfile_path

-Raw assure que Get-Content lit le fichier iput dans son ensemble en tant que unique, généralement à plusieurs lignes ce qui garantit que la chaîne de caractères suivante -replace L'opération peut effectuer une mise en correspondance à travers les lignes .


Quant à ce que vous avez essayé :

$currentfile_data = Get-Content $currentfile_path

Cela permet d'économiser un tableau de la lignes du fichier d'entrée dans la variable $currentfile_data parce que Get-Content diffuse par défaut les lignes du fichier cible. un par un .

$currentfile_data -Replace '...'

Cela rend le -replace l'opérateur agit sur chaque élément du tableau stocké dans $currentfile_data c'est-à-dire sur chaque ligne du fichier original plutôt que à travers les lignes .


A PowerShell (Core) 7+ alternative :

Comme Santiago Squarzon souligne que PowerShell (Core) 7+ est livré avec l'application ConvertFrom-Markdown cmdlet, qui peut directement transformer votre fichier d'entrée en HTML (bien que ce ne soit pas exactement le même format) :

(@'
| th1 | th2 | th3 |
| :-: | :-: | :-: |
| td1 | td2 | td3 |
'@ | ConvertFrom-Markdown).Html

Sortie :

<table>
<thead>
<tr>
<th style="text-align: center;">th1</th>
<th style="text-align: center;">th2</th>
<th style="text-align: center;">th3</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">td1</td>
<td style="text-align: center;">td2</td>
<td style="text-align: center;">td3</td>
</tr>
</tbody>
</table>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X