PowerShell для поиска определенного слова в файле и добавления "4" в начале строки

-7


I am the best. Page
I am good. Page
I am funny. Page

Выход:


4 I am the best. Page
4 I am good. Page
4 I am funny. Page

Скрипт PowerShell должен искать "страницу" и добавить "4" в начале строки. Я создал этот скрипт:

powershell -Command "sed ‘s/^Page/4 &/‘c:\users*.txt >test.txt"

но он не работал в PowerShell.

спросил(а) 2017-12-13T22:04:00+03:00 1 год, 11 месяцев назад
3
3 ответа
79

powershell -command "foreach($ln in cat 'c:\users*.txt'){if($ln -match 'page'){write-host '4'$ln}}"

или же

powershell -command "foreach($ln in cat 'c:\users*.txt'){if($ln -match 'page'){write-host '4'$ln}else{echo $ln}}"

в зависимости от того, хотите ли вы только выводить строки с "страницей" в них.

Обратите внимание также, что powershell не имеет встроенного псевдонима для sed а ваша /^Page/ будет иметь только совпадающую "страницу" в начале строки в любом случае.

ответил(а) 2017-12-13T23:57:00+03:00 1 год, 11 месяцев назад
32

sed - это инструмент командной строки Unix, который обычно не устанавливается в Windows (хотя есть порты Windows).

Способ PowerShell делать то, что вы просите,

(Get-Content 'c:\users\*.txt') -replace '.*page','4$&' | Set-Content 'test.txt'

или (с использованием псевдонимов и перенаправления для сокращенного набора текста):

(cat 'c:\users\*.txt') -replace '.*page','4$&' > 'test.txt'

Если вы хотите обновить каждый файл отдельно (обратите внимание: это НЕ то, что делает ваш фрагмент кода Unix), вы бы сделали что-то вроде этого:

Get-ChildItem 'C:\users\*.txt' | ForEach-Object {
(Get-Content $_.FullName) -replace '.*page','4$&' | Set-Content $_.FullName
}

или (снова используя псевдонимы):

ls 'c:\users\*.txt' | %{(cat $_.FullName) -replace '.*page','4$&' | sc $_.FullName}

Обратите внимание, что вы не можете использовать перенаправление в этом случае, потому что оператор перенаправления откроет файл для записи, прежде чем cat сможет его прочитать, что бы эффективно обрезать файл.

ответил(а) 2017-12-13T23:46:00+03:00 1 год, 11 месяцев назад
33

Это должно сделать это:

$content = Get-Content "C:\path\to\my\file.txt" 
$newcontent = $null

Foreach($line in $content)
{
if($line -ne "")
{
$line = "4 "+"$line'r'n"
$newcontent += $line
}
else
{
$newcontent += "'r'n"
}
}

Set-Content -Path "C:\path\to\my\file.txt" -Value $newcontent

ответил(а) 2017-12-13T23:09:00+03:00 1 год, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема