Показать полную графическую версию : [решено] Удаления строки ниже найденого текста.
DJ Mogarych
23-08-2019, 21:44
Я пытался "захватить следующую строку" с помощью Regex типа ".*txt1.*\n.*" или ".*txt1.*\r.*", но ничего не вышло.
Также, сначала убивал строку с паттерном, а потом пытался захватить пустую строку и следующую за ней:"\s+\n.*", но тоже не сработало.
, но ничего не вышло. »
То есть?
$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. произвольный текст
Шаблон будет нуждаться в доработке для охвата граничных случаев, но так-то — работает, не?
но ничего не вышло. »
но тоже не сработало. »
Тут важно, как подается текст на обработку регэкспами (построчно или массивом)... скорее всего, в этом проблема.
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
DJ Mogarych, так — да, не будет работать, потому что командлет Get-Content возвращает именно массив отдельных строк (в которых нет символа \n), а не одну строку с символами «конец строки» внутри. Нужно добавить в командлет Get-Content параметр -Raw, тогда должно получиться то, что нужно.
(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"
Да, я догадался уже после того, как написал последнее сообщение, что массив рассматривается не как единый объект, а каждая строка рассматривается по отдельности.
а каждая строка рассматривается по отдельности »
Да, тут главное - не запутаться в терминологии... массив текста, по сути, один объект, а массив строк - множество объектов, по одному на каждую строку...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC