Вы можете использовать модификатор g
в конце регулярного выражения для замены всех вхождений сопоставления с образцом.
{one:"1",two:"2",three:"3",one:"one",plz:"nope"}
Я хочу заменить все после one
на "42"
. Без глобального модификатора я получаю такой результат:
$ sed -E 's/one:[^,]+/one:"42"/' foo.txt
{one:"42",two:"2",three:"3",one:"one",plz:"nope"}
Обратите внимание, что второй экземпляр one:
не изменился. Теперь с модификатором g
:
$ sed -E 's/one:[^,]+/one:"42"/g' foo.txt
{one:"42",two:"2",three:"3",one:"42",yas:"nope"}
, который заменяет все вхождения.
Вставьте это в файл, который может называться replacer.sh
:
#!/usr/bin/env bash
# declare `swap` to be an associative array
declare -A swap
swap[appVersion]='"1.4-beta"'
swap[buildNr]='"20190118.1"'
swap[production]="!"
swap[tracking]="!0"
swap[apiHost]='"\/api-2\/"'
swap[foo]='"bar"'
FILE=$1
for key in ${!swap[@]}; do sed -E -i 'bak' "s/${key}:[^,]+/${key}:${swap[${key}]}/g" $FILE; done
Измените ключи и значения в переменной swap
так, чтобы вам было нужно. Дело имеет значение, и избежать каких-либо обратной косой черты в ценностях.
Если вам нужно заменить больше вещей, вы можете просто добавить больше пар ключ / значение. Цикл будет перебирать все ключи, применяя изменения по порядку.
sed
может автоматически создавать файлы резервных копий с флагом -i
; Я думаю, что они могут сорваться во время каждой итерации цикла - будьте осторожны.
Запустите программу так: $ ./replacer.sh filename.js
Надеюсь, это поможет!
Я ввел по абсолютному адресу вокруг с ним некоторые при записи вопроса и придумал это:
using System.IO;
using log4net;
using log4net.Config;
using log4net.ObjectRenderer;
using log4net.Util;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
BasicConfigurator.Configure();
ILog log = LogManager.GetLogger(typeof(Program));
var repo = LogManager.GetRepository();
repo.RendererMap.Put(typeof(Foo), new FooRenderer());
var fooInstance = new Foo() { Name = "Test Foo" };
log.Info(fooInstance);
}
}
internal class Foo
{
public string Name { get; set; }
}
internal class FooRenderer : log4net.ObjectRenderer.IObjectRenderer
{
public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
{
if (obj == null)
{
writer.Write(SystemInfo.NullText);
}
var fooInstance = obj as Foo;
if (fooInstance != null)
{
writer.Write("", fooInstance.Name);
}
else
{
writer.Write(SystemInfo.NullText);
}
}
}
}
Я не уверен - ли это корректный способ сделать это, но я действительно знаю, что он работал.