PDA

Показать полную графическую версию : [решено] Удаления строки ниже найденого текста.


Страниц : 1 [2]

DJ Mogarych
23-08-2019, 21:44
Я пытался "захватить следующую строку" с помощью Regex типа ".*txt1.*\n.*" или ".*txt1.*\r.*", но ничего не вышло.
Также, сначала убивал строку с паттерном, а потом пытался захватить пустую строку и следующую за ней:"\s+\n.*", но тоже не сработало.

Iska
23-08-2019, 22:05
, но ничего не вышло. »
То есть?
$sContent = @'
1. произвольный текст
2. произвольный текст
3. произвольный текст txt1 произвольный текст
4. произвольный текст
5. произвольный текст
6. произвольный текст txt1 произвольный текст
7. произвольный текст
8. произвольный текст txt1 произвольный текст
9. произвольный текст
10. произвольный текст
11. произвольный текст
'@

[RegEx]::IsMatch($sContent, ".*txt1.*\n.*\n")
[RegEx]::Replace($sContent, ".*txt1.*\n.*\n", "")

True
1. произвольный текст
2. произвольный текст
5. произвольный текст
10. произвольный текст
11. произвольный текст

Шаблон будет нуждаться в доработке для охвата граничных случаев, но так-то — работает, не?

YuS_2
24-08-2019, 07:51
но ничего не вышло. »
но тоже не сработало. »
Тут важно, как подается текст на обработку регэкспами (построчно или массивом)... скорее всего, в этом проблема.

DJ Mogarych
24-08-2019, 08:52
Вот так не работает, хотя почему - непонятно.
(gc C:\temp\123.txt) -notmatch ".*txt1.*\n.*\n"
В данном случае то, что в скобках - это массив.
(gc C:\temp\123.txt).GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

Iska
24-08-2019, 09:22
DJ Mogarych, так — да, не будет работать, потому что командлет Get-Content возвращает именно массив отдельных строк (в которых нет символа \n), а не одну строку с символами «конец строки» внутри. Нужно добавить в командлет Get-Content параметр -Raw, тогда должно получиться то, что нужно.

YuS_2
24-08-2019, 09:28
(gc C:\temp\123.txt) -notmatch ".*txt1.*\n.*\n" »
а так:
(gc C:\temp\123.txt -raw) -notmatch ".*txt1.*\n.*\n"
?
По сути, Ваша запись соответствует:
gc C:\temp\123.txt|%{$_ -notmatch ".*txt1.*\n.*\n"}

А чтобы было наглядно, какие процессы происходят:
gc C:\temp\123.txt|%{$_;'==='}
gc C:\temp\123.txt -raw|%{$_;'==='}
- в консоли будет видна разница...

DJ Mogarych
24-08-2019, 09:46
Спасибо!
Вот так работает:
(gc C:\temp\123.txt -raw) -replace ".*txt1.*\n.*\n"
Да, я догадался уже после того, как написал последнее сообщение, что массив рассматривается не как единый объект, а каждая строка рассматривается по отдельности.

YuS_2
24-08-2019, 12:55
а каждая строка рассматривается по отдельности »
Да, тут главное - не запутаться в терминологии... массив текста, по сути, один объект, а массив строк - множество объектов, по одному на каждую строку...




© OSzone.net 2001-2012