PowerShell для поиска определенного слова в файле и добавления "4" в начале строки
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.
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/
будет иметь только совпадающую "страницу" в начале строки в любом случае.
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
сможет его прочитать, что бы эффективно обрезать файл.
Это должно сделать это:
$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