Этим достигается то, что вы запрашиваете.
sed 's/address.*/&%200/' current.txt
Пример:
$ sed 's/address.*/&%200/' current.txt
ltm node /test/10.90.0.1 {
address 10.90.0.1%200
}
ltm node /test/10.90.0.12 {
address 10.90.0.12%200
}
ltm node /test/10.90.0.50 {
address 10.90.0.50%200
}
$
По умолчанию bash обрабатывает массивы как индексированные массивы.
В этом случае индексы оцениваются как арифметическое выражение.
$ joe=3 mary=6
$ unset data
$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -a data=([3]="111" [6]="bbb")
Вывод показывает несколько вещей:
-a
в выводе. joe
и mary
. Это так, даже если индексы заключены в кавычки (даже одинарные кавычки):
$ joe=3 mary=6
$ unset data
$ data=(["joe"]=111 ["mary"]=bbb)
$ declare -p data
declare -a data=([3]="111" [6]="bbb")
Если строки, используемые в качестве индексов, не были определены как содержащие число, они в любом случае оцениваются как арифметическое выражение, имеющее нулевое значение.
$ unset joe ; unset mary ; unset data
$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -a data=([0]="bbb")
Что произошло: [joe]=111
оценивается в [0]=111
, устанавливая массив с индексом 0
в 111
. Но затем, [mary]=bbb
оценивается в [0]=bbb
, заменяя значение массива по индексу 0
на bbb
.
Чтобы действительно иметь ассоциативный массив, он должен быть определен как таковой до его использования.
Он не может быть изменен, пока содержит данные. С массивом, заданным как указано выше:
$ declare -A data
bash: declare: data: cannot convert indexed to associative array
Но очистив его, мы можем:
$ joe=3 ; mary=6 ; unset data
$ declare -A data
$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -A data=([joe]="111" [mary]="bbb" )
Как видите, не имеет значения, что строки, используемые в качестве индексов, также являются допустимыми именами переменных и что они содержат значение. Они используются как индексы строк для ассоциативного массива.
. Ассоциативные массивы должны быть объявлены явно, с типом typeset -A
или что-то подобное ( объявить -A
или только для чтения -A
в bash). По умолчанию массив представляет собой «простой» массив с целочисленными индексами.Нечисловые индексы в массивах с целочисленным индексом интерпретируются как арифметические выражения, а неустановленные имена переменных в арифметических выражениях автоматически интерпретируются как 0, поэтому data = ([joe] = 30 [mary] = 25)
устанавливает data [0] = 30
, затем data [0] = 25
, и $ {data [something]}
- это элемент 0, который равен 25.
.
bash-4.3$ indexed=([a]=aye [b]=bee [x+1]=cee)
bash-4.3$ echo length=${#indexed[@]} a=${indexed[a]} b=${indexed[b]} x+1=${indexed[x+1]} 1=${indexed[1]}
length=2 a=bee b=bee x+1=cee 1=cee
bash-4.3$ typeset -A associative=([a]=aye [b]=bee [x+1]=cee)
bash-4.3$ echo length=${#associative[@]} a=${associative[a]} b=${associative[b]} x+1=${associative[x+1]} 1=${associative[1]}
length=3 a=aye b=bee x+1=cee 1=
Поскольку индексированный
является массивом с числовыми индексами, индексированный [a]
и индексированный [b]
оба индексируются [0]
], а проиндексировано [x + 1]
- это проиндексировано [1]
. В ассоциативном массиве то, что находится внутри скобок, анализируется как строка (с обычными расширениями, как в двойных кавычках, поэтому вы можете написать $ {ассоциативный [$ key]}
).