Как я могу смешать математику с регулярными выражениями в Awk или Sed? - PullRequest
2 голосов
/ 10 сентября 2010

Я использовал regex в sed раньше и использовал немного awk, но не уверен, какой именно синтаксис мне нужен здесь ...

Я хочу сделать что-то вроде:

sed -i 's/restartfreq\([\s]\)*\([0-9]\)*/restartfreq\1$((\2/2))/2/g' \
    my_file.conf

, где второе совпадение делится на 2, а затем помещается обратно во встроенное редактирование.

Я читал, что sed не может сделать математику.

Можно ли сделать это чистос sed или awk один?Предложения, пожалуйста.

Редактировать 1
Я думал, что смысл моего запроса достаточно прост, но я думаю, что, возможно, я не дал достаточно хороший образец данных, которые я хочу изменить,Вот и пример строки в моем * .conf-файле, который я хочу редактировать inline:

restartfreq        1250    ;# 2500steps = every 1.25 ps

Я разместил решение ниже.Оба ответа, которые я получил, касались печати текста на терминале, а не редактирования файла в строке.Я стараюсь не отвечать на свой вопрос, но в этом случае ни один из полученных ответов действительно не выполнил то, что я просил (отредактировать файл, а не просто распечатать отредактированную строку), и они были значительно длиннее моего решения и / или требовали дополнительного linuxпрограммы, кроме просто awk или sed.

Я ценю помощь и обратную связь, хотя!:)

ПРИМЕЧАНИЕ. Как и мой обычный отказ от ответственности, это не домашнее задание, я - инженер-химик.

Ответы [ 4 ]

2 голосов
/ 10 сентября 2010
$ cat script.awk
/restartfreq *[0-9]+/{
    $2 = $2/2
}
{print}
$ awk -f script.awk my_file.conf

Если вы всегда хотите, чтобы число было целым числом, измените $2/2 на int($2/2).


Чтобы перезаписать файл, вы можете использовать губку (если у вас есть moreutils доступно) или временный файл.

Последнее должно быть само за себя.
Губка позволяет вам:

$ awk -f script.awk my_file.conf | sponge my_file.conf
1 голос
/ 11 сентября 2010

это то, как вы делаете это только с awk

 awk '$1=="restartfreq"{$2=$2/2;}1' file > t && mv t file
0 голосов
/ 10 сентября 2010

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

awk '{gsub(/restartfreq\s*[0-9]+/,$2/2,$2)}' my_file.conf

Извинения Деннису, et. Я ответил на мой собственный вопрос, но я чувствую, что это лучшее решение, и, надеюсь, оно принесет пользу другим, кто читает это ...

Редактировать 1

Упс, я солгал. Это просто печатает на терминал тоже ...

Мне потребовалось много времени, чтобы найти, но это работает, используя только sed и awk:

sed -i '/restartfreq/s/'`sed -n 's/restartfreq*/&/p' my_file.conf | awk '{print $2}'`'/'`sed -n 's/restartfreq*/&/p' my_file.conf | awk '{print $2/2}'`'/g' my_file.conf

Возможно, это можно упростить, но, по крайней мере, это работает! :)

0 голосов
/ 10 сентября 2010

Это может быть в соответствии с тем, что вы ищете:

$ echo 'restart 4' | awk '{$2=$2/2; print}'
restart 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...