Я борюсь даже со всеми примерами, доступными в stackoverflow и google.
В основном у меня есть следующий текст
/start r.start ""
GAIN 0x256 __POSITIVE 1 FOO
OTHER
OTHER
/start MACRO
200
CODE "r.start" 0x256 0x2 10 0xA3
/end MACRO
OTHER
/end
, и мне нужно прочитать этот файл в поисках Назовите egrstart, который передается как $ 1, и подставьте, например, 0x256 значением, которое я передаю как $ 2. Есть два экземпляра для замены, строка 2 и строка 7.
Вещи, которые я знаю:
- / начало предшествует 4 пробела
- GAIN предшествует 6 пробелы
- \ r \ n или \ n могут присутствовать
- КОДУ предшествуют 8 пробелов
До сих пор я достиг этой точки
pattern="N;s\s\/start r.start \"\"\n GAIN 0x\(.*\)"
replacement"\/start r.start \"\"\n GAIN 0x82"
sed -e "$pattern/$replacement/p" test.txt
но я ничего не получаю. Я также смог заменить первую строку, но по какой-то причине он вставил мне первые две строки дважды друг на друга
ожидаемое значение, предполагая, что следующий вызов
./run.sh r.start 0x284569
должен быть
/start r.start ""
GAIN 0x284569 __POSITIVE 1 FOO
OTHER
OTHER
/start MACRO
200
CODE "r.start" 0x284569 0x2 10 0xA3
/end MACRO
OTHER
/end
Вот мой лучший снимок для второй части
var="r.start"
val="0x48209F82"
pattern="\(CODE \"$var\" \).*\(.*\)"
replacement="\1$val\2"
sed "s/$pattern/$replacement/g" test.txt
Проблема в том, что он удаляет все после подстановки значения. Я не могу вставить \ 2 следующие символы
РЕДАКТИРОВАТЬ:
Делая следующее
var="r.start"
val="0x48209F82"
pattern="\(CODE \"$var\" \).*\(\s.*\s.*\s.*\)"
replacement="\1$val\2"
sed "s/$pattern/$replacement/g" test.txt
Я получаю то, что я хочу, но он немного грязный Как уменьшить последнюю часть в случае переменного числа символов? Могу ли я просто как-нибудь сопоставить все до конца строки?