Когда я делаю

function replace { ( perl -i -slpe 's/^$string.*\K/$add/' -- -string="$1" -add="$2" $3 ) } 

replace 'passwd:' 'files dns' /tmp/1

Я получил

passwd:     filesfiles dns
group:      files

Который должен был быть

passwd:     files dns
group:      files

Входные файлы

passwd:     files
group:      files

Вопрос

Может ли кто-нибудь объяснить, почему этого не происходит?

3
Sandra Schlichting 12 Апр 2018 в 14:14

1 ответ

Лучший ответ

Ваши \K и .* вообще не в том месте, то, что вы сделали с ^$string.*\K, совпало со всей строкой (.* жадно) перед вставкой \K квантификатор, это означает, что вставка происходит после совпадения всей строки. Вы должны изменить его, чтобы он был более эффективным, поскольку

perl -i -slpe 's/^$string\s+\K.*/$add/' -- -string="$1" -add="$2" "$3"

Таким образом, вы позаботитесь о правильном интервале после строки поиска и добавите после него заменяющую часть. Также вам не нужно ключевое слово function в функциях оболочки, а также полностью отбросить () и просто сделать

replace () {
    perl -i -slpe 's/^$string\s+\K.*/$add/' -- -string="$1" -add="$2" "$3"
}
5
Inian 12 Апр 2018 в 11:24