¿Cómo eliminar una línea si una línea contiene un valor vacío después del símbolo = usando powershell o Javascript?
Mi valor de entrada es
variable1 = value1 variable2 = value2 variable3 = variable4 = value4 variable5 =los valores pueden cambiar. Estoy buscando un script que elimine líneas si el valor está vacío después del símbolo =.
Parece que está tratando de modificar un archivo .INI y, al hacerlo, puede arruinar la inicialización de algunas aplicaciones.
Habiendo dicho eso, en PowerShell puedes hacer:
$result = Get-Content -Path 'X:\theInputFile.txt' | Where-Object { $_ -match '^\w+\s*=\s*\S+' } $string = @' variable1 = value1 variable2 = value2 variable3 = variable4 = value4 variable5 = '@ $result = $string -split '\r?\n' | Where-Object { $_ -match '^\w+\s*=\s*\S+' } La variable $result será una matriz de cadenas:
variable1 = value1 variable2 = value2 variable4 = value4Puede guardar eso en (un nuevo) archivo usando
$result | Set-Content -Path 'X:\theNewInputFile.txt'Detalles de expresiones regulares:
^ Assert position at the beginning of the string \w Match a single character that is a “word character” (letters, digits, etc.) + Between one and unlimited times, as many times as possible, giving back as needed (greedy) \s Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.) * Between zero and unlimited times, as many times as possible, giving back as needed (greedy) = Match the character “=” literally \s Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.) * Between zero and unlimited times, as many times as possible, giving back as needed (greedy) \S Match a single character that is a “non-whitespace character” + Between one and unlimited times, as many times as possible, giving back as needed (greedy)Para complementar la útil respuesta de Theo , que utiliza un enfoque basado en cmdlet de transmisión, con un enfoque de operador (puro), que es más rápido, pero requiere más memoria (el uso de la memoria generalmente no es una preocupación con los archivos de texto):
Como señala zett42 , los operadores de comparación como -match actúan como filtros si el operando LHS (entrada) es una matriz , por lo que puede hacer coincidir una expresión regular directamente con una matriz de líneas para obtener la sub-matriz de líneas coincidentes:
# Filter the lines of file inputFile.txt by returning only those on which # "=" is followed by at least one non-whitespace character ("\S"), # optionally preceded by any number of other characters (".*"). @(Get-Content inputFile.txt) -match '=.*\S' Puede acelerar la llamada Get-Content agregando -ReadCount 0 .
En cuanto a cuándo usar un enfoque de transmisión frente a un operador puro: consulte la sección sobre compensaciones en esta respuesta .