Заменить вхождения строки в файле разными байтами энтропии каждый - PullRequest
1 голос
/ 01 марта 2020

В Linux мне нужно программно заменить строки-заполнители, такие как <SECRET>, в файле .env следующим образом:

KEY=<SECRET>
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=<SECRET>

Предупреждение: каждое вхождение этого заполнителя должно быть заменен на другое создание экземпляра кодированной в Base64 случайности - например, из OpenSSL, поскольку он легко доступен во многих Linux.

чтение этот ответ , я пробовал это с GNU sed 4.8:

sed -i '0,/<SECRET>/ s__'$(openssl rand -base64 42)'_' .env

(В части замещения был выбран альтернативный разделитель _, поскольку закодированные в Base64 байты могут содержать символы / или + и в противном случае будут иметь значение sh при непреднамеренно используется в качестве разделителей.)


Это работает для одиночных замен, по одному вызову за раз.

Но код возврата sed всегда 0, даже когда все вхождения регулярного выражения были использованы и заменены ...

Вопрос: есть ли способ заставить sed возвращать ненулевой код, когда заполнители были исчерпаны?

(Если это не может быть сделано с помощью sed, я рад любому решению с awk или подобным.)

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Вместо sed вы можете использовать grep:

grep '<SECRET>' .env

С man grep:

СТАТУС ВЫХОДА

Обычно выход статус равен 0, если линия выбрана, 1, если строки не выбраны, и 2, если произошла ошибка. Однако, если используются -q или --quiet или --silent и выбрана строка, состояние выхода равно 0, даже если произошла ошибка.

Если возвращаемое значение равно 0, то примените команду sed для выполнения замены.

1 голос
/ 01 марта 2020
$ awk '
    BEGIN { cmd = "openssl rand -base64 42" }
    match($0,/<SECRET>/) {
        val = ( (cmd | getline line) > 0 ? line : "N/A" )
        $0 = substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
        close(cmd)
    }
1' file
KEY=hDc3Bw4J9+TUbbhw4cNKda+mDHVRGGrAWUU6LX7aYZnWwDZWyqrmzi3z
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=LzGaB43Mm5mF6tsJnwOLqgeeoTwajH9FNLty9yD22QovadhwWKpr7AP6

или если <SECRET> может встречаться несколько раз в одной строке, то:

$ awk '
    BEGIN { cmd = "openssl rand -base64 42" }
    {
        while ( match($0,/<SECRET>/) ) {
            val = ( (cmd | getline line) > 0 ? line : "N/A" )
            $0 = substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
            close(cmd)
        }
    }
1' file
KEY=t3/bimGkyPQcjOL6ubV6QmRnPjrvtg4+HvvkuJSnuYCYc+BzOmAWKRV6
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=TKvDbMphOhmhL0/NSQEE2Gs9sFr3Cwt9o3CbOoe9FZPjAR/+m6i4QjcR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...