мы хотим подготовить подход sed
для изменения значения ключа - ParallelGCThreads
, и это произойдет только для совпадающего слова в строке, как HADOOP_DATANODE_OPTS
more Hadoop-specific-environment.txt
.
.
export HADOOP_DATA_NODE_OPTS = "-server -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log
.
.
поэтому мы подготовили следующий синтаксис sed
val-32
HADOOP_OPTS=HADOOP_DATA_NODE_OPTS
sed -i "/$HADOOP_OPTS/s/-XX:ParallelGCThreads=[0-9]*/-XX:ParallelGCThreads=$val/" Hadoop-specific-environment.txt
выше sed
работает нормально, но у нас есть некоторые проблемы
в случае, если ключ ParallelGCThreads имеет значение null (без значения), замена не удастся
ПараллельGCThreads=
значение будет заменено, четная строка находится в комментарии
#export HADOOP_DATA_NODE_OPTS=
каковы правильные исправления для решения вышеуказанных проблем
любое другое предложение будет приветствоваться, включая один вкладыш Perl
=[0-9]*
следует заменить на (=[0-9]*)?
.
^[^#]*
следует добавить в начале первого регулярного выражения.
sed -i -E "/^[^#]*$HADOOP_OPTS/s/-XX:ParallelGCThreads(=[0-9]*)?/-XX:ParallelGCThreads=$val/" Hadoop-specific-environment.txt
Не работает, если у ParallelGCThreads нет номера.
@Bayou В моем случае это работает с опцией -E
, -r
или --regexp-extended
.
Спорил не о -E
или -r
, а об этом предложении в посте: in case key - ParallelGCThreads is null ( without value ) then replaced will failed
это может измениться comment
вместо value
в таких строках, как export var=value # comment
; также рассмотрите (=[0-9]*)?
вместо =[0-9]+
, чтобы поймать все a=n
/ a=
и a
технически, вероятно, также должны требоваться ведущие пробелы перед -XX:
и конечные пробелы или двойные кавычки. но это может быть перебор
кроме того, как и текущий ответ @bayou, это изменит строку типа NOT_HADOOP_DATA_NODE_OPTS=
, если она содержит параметр, опять же крайний случай, но...
Я проверяю ваш sed, но если -XX:ParallelGCThreads= не имеет значения, то sed не добавляет значение как -XX:ParallelGCThreads=16
@Джуди, я думал, что в данном случае его не следует добавлять. Тогда используйте (=[0-9]*)?
вместо =[0-9]*
.
Вам необходимо создать группы, чтобы вы могли напрямую перейти к той части, которую хотите изменить. Не забудьте добавить опцию -i
самостоятельно после проверки вывода.
$ cat Hadoop-specific-environment.txt
export HADOOP_DATA_NODE_OPTS = "-server -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log"
export HADOOP_DATA_NODE_OPTS = "-server -XX:ParallelGCThreads= -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log"
** test test test **
export HADOOP_DATA_NODE_OPTS = "-server -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log -XX:ParallelGCThreads = "
#export HADOOP_DATA_NODE_OPTS = "-server -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log -XX:ParallelGCThreads = "
** some other exports **
$ sed -r '/^[^#].*HADOOP_DATA_NODE_OPTS=/ s/^(.*ParallelGCThreads)=[0-9]*(.+)$/\1=42\2/' Hadoop-specific-environment.txt
export HADOOP_DATA_NODE_OPTS = "-server -XX:ParallelGCThreads=42 -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log"
export HADOOP_DATA_NODE_OPTS = "-server -XX:ParallelGCThreads=42 -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log"
** test test test **
export HADOOP_DATA_NODE_OPTS = "-server -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log -XX:ParallelGCThreads=42"
#export HADOOP_DATA_NODE_OPTS = "-server -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hadoop/$USER/hs_err_pid%p.log -XX:ParallelGCThreads = "
** some other exports **
Объяснение регулярного выражения:
/^[^#].*HADOOP_DATA_NODE_OPTS=/ -> must be an uncommented HADOOP_DATA_NODE_OPTS variable.
s/^(.*ParallelGCThreads)=[0-9]*(.+)$/
^(.*ParallelGCThreads) -> Group \1: Everything until variable
=[0-9]* -> skipped, overwritten later
(.+)$ -> Group \2: The rest you want
/\1=42\2/
\1 -> Show first group
=42 -> Use 42 ParallelGCThreads
\2 -> Show second group
@jhnc. См. проблему 1 в исходном сообщении. Хотя комментарии действительны. Исправим это.
не было бы (=[0-9]*)?
чище? также это не ясно из вопроса, но не учитывает полное отсутствие ParallelGCThreads
(другая интерпретация is null (without value)
также можно использовать [^#]*
вместо .*
для обработки регистра таких строк, как export var=value # comment
Если переменная не существует, она ничего не делает, поскольку регулярное выражение не соответствует. Создание промежуточной группы может сбивать с толку, когда вы имеете дело с большим количеством групп, поэтому я стараюсь не делать их слишком много.
да, но если идея состоит в том, чтобы установить параметр равным 32, я ожидаю, что строку экспорта все равно придется изменить.
(моя цель с помощью (=[0-9]*)?
заключалась в том, чтобы поймать все a=b
/a=
и a
)
Было бы [=0-9]*
хорошей золотой серединой?
только ОП может сказать. он выявляет некорректные случаи, =1=2=3=4=5
но это может не быть проблемой
это кажется очень хрупким способом обновления. почему бы не провести рефакторинг
Hadoop-specific-environment.txt
, чтобы упростить внесение изменений? Если это все равно сценарий оболочки, просто добавьте строкуmyvar=value
и используйте$myvar
в строке экспорта. теперь найти строку для изменения тривиально. или это может быть файл переопределения