Sed + сопоставить слово в строках и заменить значение некоторыми условиями

мы хотим подготовить подход 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 работает нормально, но у нас есть некоторые проблемы

  1. в случае, если ключ ParallelGCThreads имеет значение null (без значения), замена не удастся

    ПараллельGCThreads=

  2. значение будет заменено, четная строка находится в комментарии

    #export HADOOP_DATA_NODE_OPTS=

каковы правильные исправления для решения вышеуказанных проблем

любое другое предложение будет приветствоваться, включая один вкладыш Perl

это кажется очень хрупким способом обновления. почему бы не провести рефакторинг Hadoop-specific-environment.txt, чтобы упростить внесение изменений? Если это все равно сценарий оболочки, просто добавьте строку myvar=value и используйте $myvar в строке экспорта. теперь найти строку для изменения тривиально. или это может быть файл переопределения

jhnc 16.08.2024 14:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

=[0-9]* следует заменить на (=[0-9]*)?.

^[^#]* следует добавить в начале первого регулярного выражения.

sed -i -E "/^[^#]*$HADOOP_OPTS/s/-XX:ParallelGCThreads(=[0-9]*)?/-XX:ParallelGCThreads=$val/" Hadoop-specific-environment.txt

Не работает, если у ParallelGCThreads нет номера.

Bayou 16.08.2024 14:45

@Bayou В моем случае это работает с опцией -E, -r или --regexp-extended.

Stas Simonov 16.08.2024 14:50

Спорил не о -E или -r, а об этом предложении в посте: in case key - ParallelGCThreads is null ( without value ) then replaced will failed

Bayou 16.08.2024 14:52

это может измениться comment вместо value в таких строках, как export var=value # comment; также рассмотрите (=[0-9]*)? вместо =[0-9]+, чтобы поймать все a=n / a= и a

jhnc 16.08.2024 15:09

технически, вероятно, также должны требоваться ведущие пробелы перед -XX: и конечные пробелы или двойные кавычки. но это может быть перебор

jhnc 16.08.2024 15:10

кроме того, как и текущий ответ @bayou, это изменит строку типа NOT_HADOOP_DATA_NODE_OPTS=, если она содержит параметр, опять же крайний случай, но...

jhnc 16.08.2024 15:13

Я проверяю ваш sed, но если -XX:ParallelGCThreads= не имеет значения, то sed не добавляет значение как -XX:ParallelGCThreads=16

Judy 16.08.2024 16:36

@Джуди, я думал, что в данном случае его не следует добавлять. Тогда используйте (=[0-9]*)? вместо =[0-9]*.

Stas Simonov 16.08.2024 16:42

Вам необходимо создать группы, чтобы вы могли напрямую перейти к той части, которую хотите изменить. Не забудьте добавить опцию -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 в исходном сообщении. Хотя комментарии действительны. Исправим это.

Bayou 16.08.2024 14:47

не было бы (=[0-9]*)? чище? также это не ясно из вопроса, но не учитывает полное отсутствие ParallelGCThreads (другая интерпретация is null (without value)

jhnc 16.08.2024 14:54

также можно использовать [^#]* вместо .* для обработки регистра таких строк, как export var=value # comment

jhnc 16.08.2024 14:57

Если переменная не существует, она ничего не делает, поскольку регулярное выражение не соответствует. Создание промежуточной группы может сбивать с толку, когда вы имеете дело с большим количеством групп, поэтому я стараюсь не делать их слишком много.

Bayou 16.08.2024 14:59

да, но если идея состоит в том, чтобы установить параметр равным 32, я ожидаю, что строку экспорта все равно придется изменить.

jhnc 16.08.2024 15:00

(моя цель с помощью (=[0-9]*)? заключалась в том, чтобы поймать все a=b/a= и a)

jhnc 16.08.2024 15:01

Было бы [=0-9]* хорошей золотой серединой?

Bayou 16.08.2024 15:03

только ОП может сказать. он выявляет некорректные случаи, =1=2=3=4=5 но это может не быть проблемой

jhnc 16.08.2024 15:04

Другие вопросы по теме