none
полная замена строки начинающейся с определенных символов RRS feed

  • Вопрос

  • Коллеги, здравствуйте!

    Помогите реализовать на ПШ задачу: Есть текстовые конфиги, в них есть строчка начиающаяся с  DNS=..... (адреса серверов ДНС там разные), мне необходимо заменить эту строчку в файле на одну конкретную DNS=1.1.1.1

    Я пока нашел как вычитать строки начинающиеся с DNS и вывести на экран

     Get-Content conf.txt | Where-Object {$_ -match '^DNS'} |ForEach-Object {$_}

    помогите понять как сделать замену целой строки и сохранить в тот же файл.

    Полагаю это некое выражение вида replace... | Set-Content config.conf

    Спасибо!

Ответы

  • если ничего лишнего не может быть в строке которая начинается с dns= то можете использовать .+ вместо длинной конструкции

    $(Get-Content conf.txt) -Replace '^DNS=.+$', "DNS=1.1.1.1" | Out-File conf.txt

    или второй вариант можете, указать что адресов может быть более одного

    $(Get-Content conf.txt) -Replace '^DNS=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.?){1,4}', "DNS=1.1.1.1" | Out-File conf.txt


    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 23 мая 2020 г. 8:41
    • Помечено в качестве ответа Dmitry 42 23 мая 2020 г. 14:08
    Модератор

Все ответы

  • Коллеги, здравствуйте!

    Помогите реализовать на ПШ задачу: Есть текстовые конфиги, в них есть строчка начиающаяся с  DNS=..... (адреса серверов ДНС там разные), мне необходимо заменить эту строчку в файле на одну конкретную DNS=1.1.1.1

    Я пока нашел как вычитать строки начинающиеся с DNS и вывести на экран

     Get-Content conf.txt | Where-Object {$_ -match '^DNS'} |ForEach-Object {$_}

    помогите понять как сделать замену целой строки и сохранить в тот же файл.

    Полагаю это некое выражение вида replace... | Set-Content config.conf

    Спасибо!

    $(Get-Content conf.txt) -Replace '^DNS=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', "DNS=1.1.1.1" | Out-File conf.txt
    тут можно глянуть предложенный ответ всередине обсуждения


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Спасибо, Vector! Как я понимаю скрипт заменяет только 1 запись в строке, у меня там особенность, я ее сразу не упомянул, потому что рассчитывал удалять строку целиком, что после DNS= может идти от 1 до 4 адресов серверов.
  • если ничего лишнего не может быть в строке которая начинается с dns= то можете использовать .+ вместо длинной конструкции

    $(Get-Content conf.txt) -Replace '^DNS=.+$', "DNS=1.1.1.1" | Out-File conf.txt

    или второй вариант можете, указать что адресов может быть более одного

    $(Get-Content conf.txt) -Replace '^DNS=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.?){1,4}', "DNS=1.1.1.1" | Out-File conf.txt


    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 23 мая 2020 г. 8:41
    • Помечено в качестве ответа Dmitry 42 23 мая 2020 г. 14:08
    Модератор
  • Спасибо огромное, вариант с ".+" отлично подошел!

  • Не понимаю в чем нюанс, может ПШ какие-то служебные символы пишет, но программы перестают воспринимать конфиг как конфиг. Размер файла вырастает в 2 раза (350 байт и 702 байта).

    Есть какие-то нюансы связанные с этим ?

    UPD1

    Похоже он в кодировке UTF-8 пишет, если смотреть не в блокноте, то видно, что помимо текстовых символов есть еще спецсимволы после каждой буквы/цифры...продолжаю разбираться...




    • Изменено Dmitry 42 23 мая 2020 г. 15:36
  • Не понимаю в чем нюанс, может ПШ какие-то служебные символы пишет, но программы перестают воспринимать конфиг как конфиг. Размер файла вырастает в 2 раза (350 байт и 702 байта).

    Есть какие-то нюансы связанные с этим ?

    UPD1

    Похоже он в кодировке UTF-8 пишет, если смотреть не в блокноте, то видно, что помимо текстовых символов есть еще спецсимволы...продолжаю разбираться...

    покажите 2 скрина с оригинальным конфигом и новым открытые в Notepad++ с включением спецсимволов

    если конфиг линуксовый возможно что конец строки \r а не \r\n как по MS стандарту + кодировка.

    MS обычно не имеет проблем с кодировкой в отличии от linux систем, но в поше у вас есть параметр -Encoding  который возможно решит вашу проблему


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Выглядят абсолютно идентично.

    Конец строки CRLF в обоих

    Однако оригинальный файл в кодировке UTF-8 , а измененный скриптом в кодировке UCS-2 LE BOM -полагаю все дело именно в этом.

    ......

    Добавил -encoding UTF8, теперь ищу как избавиться от UTF8-BOM, чтоб была чистая UTF8

    .....

    И вот решение -encoding ASCII сохраняет в чистый UTF8 без BOM.

    В итоге скрипт обрел вот такой вид:

    $(Get-Content 'config.conf') -Replace '^DNS.+$', 'DNS = 1.2.3.4' | Out-File 'config.conf' -encoding ASCII

    • Изменено Dmitry 42 23 мая 2020 г. 16:05
  • Выглядят абсолютно идентично.

    Конец строки CRLF в обоих

    Однако оригинальный файл в кодировке UTF-8 , а измененный скриптом в кодировке UCS-2 LE BOM -полагаю все дело именно в этом..

    в таком случае в out-file используйте смену кодировки или на utf8 или default

    The opinion expressed by me is not an official position of Microsoft

    Модератор