Как изменить содержимое файла в Linux?

Это невежественный ответ, поскольку у меня нет доступа к облачному каталогу Amazon с который это проверить. Но в духе «Как это сделать» : настройте облако Amazon для обслуживания NFS , затем войдите удаленно на этот сервер NFS с помощью cachefilesd .

«Легче сказать, чем сделать ...»

2
14.04.2016, 16:05
4 ответа

Если вам нужно одно выражение, вы можете сделать:

sed -i 's#/client/[^/]*#/client/12x_64#g' config*

Я использовал / client / [^ /] * в качестве маркера, чтобы найти то, что мы хотим заменить (т.е. все, что находится после / client / , но до следующего / ), но мы могли бы сделать client / [^ / ] * / instance , если это позволяет избежать сопоставления других элементов в файле.

6
27.01.2020, 21:49

Вы можете объединить все три команды в одно выражение. Вам нужно заменить все варианты 1 , за которыми следует либо 0 , либо 1 , затем x , а затем - необязательный _64 . Это может быть выражено следующим расширенным регулярным выражением:

1[01]x(_64)*

[] обозначает символьный класс , поэтому [01] соответствует либо единице, либо нулю. Конструкция (foo) * будет соответствовать 0 или более экземплярам foo . Итак, (_ 64) * будет соответствовать как строке _64 (и ее повторениям, таким как _64_64_64 ), так и пустой строке. Это позволяет сопоставить как 11_x64 , так и 11x , и когда это не так.

Итак, если мы объединим это в выражение sed , мы получим:

sed -iE 's/1[01]x(_64)*/12_64/' config*
2
27.01.2020, 21:49

Как насчет подготовки «файла конфигурации шаблона», в котором вы заменяете необходимые части конфигурации для конкретной версии? Допустим, у вас есть следующий шаблон

#/bin/bash
echo "set ##V1##=/app/client/##ARCH1##/instance" > cfg-file1
echo "set ##V2##=/app/client/##ARCH2##/instance" > cfg-file1
echo "set ##V3##=/app/client/##ARCH3##/instance" > cfg-file1

Затем вы можете выполнять замену команд по версии в зависимости от параметра командной строки:

#!/bin/bash
[ $# -lt 1 ] && (echo "usage: replace <version>"; exit 1;)
if [ "$1" == "1" ]; then
        cat  template.txt | sed -e "s/##V1##/VAR1/g;s/##ARCH1##/arch_xy_/g;s/##V2##/VAR2/g;s/##ARCH2##/arch2_xy_/g;"
        # etc...
fi

Это можно легко расширить.

2
27.01.2020, 21:49

Вы можете просто объединить их следующим образом:

sed -i 's / 10x_64 / 12x_64 / g; s / 11x / 12x_64 / g; s / 11x_64 / 12x_64 / g 'конфигурация *

2
27.01.2020, 21:49

Теги

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