Powershell
Короткие версии
(Get-Content "in.txt" -raw) -replace "\(", "`0)" -replace "\)", "(" -replace "(`0\()", ")" >> "out.txt"
Также возможно:
Set-Content "out.txt" ((Get-Content "in.txt" -raw) -replace "\(", "`0)" -replace "\)", "(" -replace "(`0\()", ")")
- Читает в
in.txt
- Записывает в
out.txt
(прокрутите горизонтально в первом примере кода, чтобы увидеть конец строки)
Длинные версии
$in = "in.txt";
$out = "out.txt";
(Get-Content $in -raw) -replace "\(", "`0)" -replace "\)", "(" -replace "(`0\()", ")" >> $out
Также возможно:
Set-Content $out ((Get-Content $in -raw) -replace "\(", "`0)" -replace "\)", "(" -replace "(`0\()", ")")
объяснение
Пожалуйста, не обращайте внимания на загадочные обратные слэши на мгновение - они хороши только для переноса скобок, которые имеют особое значение в регулярных выражениях.
Сначала мы заменим каждое вхождение (
на NUL)
(см. Символ NUL). Затем мы заменим каждый )
на (
. На последнем этапе NUL(
заменяется на )
.
Используя этот способ, мы гарантируем, что мы не делаем "двойную замену", например:
Initial string value:
(test)
After replacing "(" by ")"
)test)
After replacing ")" by "("
(test(
Предупреждение
Файл не должен сам содержать последовательность NUL)
. Это может привести к неправильной интерпретации моего скрипта Powershell, поскольку я использовал символ NUL в качестве специального индикатора (например, такая же ситуация возникает при использовании зеленых экранов и ношении зеленой одежды).