Задать вопрос

Как SED работает с переменными?

Выполняю команду
sed -i "s/\(\([^,]\+,\)\{9\}\)/\1$((RANDOM%1000000+8243678))/" file.txt

По ней он ставит случайное число после 9 запятой в каждой строке файла.
Но по какой-то причине, видимо понять которую у меня не хватает знаний, Sed вместо того, чтобы для каждой строки получать значение переменной RANDOM%1000000+8243678, берет и проставляет одно и тоже (видимо первое полученное) значение этой переменной. Возможно это особенность работы Sed c опцией -i. Кто может подсказать возможно ли через Sed в данном случае реализовать и как простановку значения переменной RANDOM для каждой строки уникального.
  • Вопрос задан
  • 2746 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Konkase
Функция RANDOM выполняется один раз при обращении к ней, sed при открытии файла обращается к этой функции один раз, поэтому необходимо зациклить её, например так:

cat file.txt | while read line; do echo $line | sed "s/\(\([^,]\+,\)\{9\}\)/\1$((RANDOM%1000000+8243678))/"; done
Ответ написан
Albibek
@Albibek
Вопросы есть? А если найду?
SED никак не работает с этой переменной. При обработке команды shell подставляет вместо переменной уже вычисленное значение ещё до запуска самого sed.
В результате sed выполняет что-то вроде:
sed -i "s/\(\([^,]\+,\)\{9\}\)/\1\12345678))/" file.txt

Konkase совершенно правильно советует вам использовать цикл.
Ответ написан
Комментировать
fallen8rwtf
@fallen8rwtf
у вас запускается один поток и в нем содержится одна переменная $RANDOM
попробуйте сделать цикл для каждой строчки с назначением этой переменной. по сути, для каждого цикла она будет генериться заново
Ответ написан
Комментировать
@mole2
IT
переменная берется в фигурные скобки
пример
sed -i "/${controlnumber}/d" ./000
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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