sed Сопоставление с шаблоном и вставка в файл

В старых bash вам потребуется «переменная косвенность» (4-й абзац Расширение параметров оболочки ), что действительно уродливо для массивов:

myArray=('1' '2' '3' '4' '5')
myFunction() {
    local arr="${1}[@]"         # array expansion *as a string*
    local values=( "${!arr}" )  # actual array expansion
    echo "${values[@]}"
}
myFunction myArray
1 2 3 4 5

Обратите внимание, что это дает вам копию массива. Любые изменения, которые вы делаете в функции, не изменят myArrayво внешней области:

myFunc2_old () {
    local arr="${1}[@]"
    local values=( "${!arr}" )  # here's the copy
    values[0]=foo
    declare -p values
}
myFunc2_old myArray; declare -p myArray
declare -a values=([0]="foo" [1]="2" [2]="3" [3]="4" [4]="5")
declare -a myArray=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")

В отличие от namerefs

myFunc2_ref () {
    local -n arr=$1
    arr[0]=foo
    declare -p arr
}
myFunc2_ref myArray; declare -p myArray
declare -n arr="myArray"
declare -a myArray=([0]="foo" [1]="2" [2]="3" [3]="4" [4]="5")

0
26.02.2020, 20:21
1 ответ

sed— инструмент, ориентированный по линии -. Я считаю, что лучше было бы использовать awk, так будет легче обнаружить тот блок, к которому вы хотите, и добавить строку. Может быть более элегантный способ, но он делает то, что вам нужно:

awk '$0=="REQUIRED_PACKAGES = [" {found=1}
    found==1 && $0=="]" {print "    \047test == 1.1.0\047"; found=0}
    {print}' setup.py

Довольно просто понять :Он печатает каждую строку файла, но перед печатью закрывающей скобки блока REQUIRED_PACKAGESпечатает строку, которую вы хотите добавить.

1
28.04.2021, 23:22

Теги

Похожие вопросы