Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何将数学与正则表达式';是Awk还是Sed?_Bash_Math_Sed_Awk - Fatal编程技术网

Bash 如何将数学与正则表达式';是Awk还是Sed?

Bash 如何将数学与正则表达式';是Awk还是Sed?,bash,math,sed,awk,Bash,Math,Sed,Awk,我以前在sed中使用过正则表达式,并使用了一些awk,但我不确定这里需要的确切语法 我想做一些类似的事情: sed -i 's/restartfreq\([\s]\)*\([0-9]\)*/restartfreq\1$((\2/2))/2/g' \ my_file.conf 其中第二个匹配项除以2,然后放回内联编辑 我读到塞德不会做数学 我可以单独用sed或awk干净地完成这项工作吗?请给我一些建议 编辑1 我认为我的调查的意义很简单,但我想我可能没有给出一个足够好的数据样本,我想修改

我以前在sed中使用过正则表达式,并使用了一些awk,但我不确定这里需要的确切语法

我想做一些类似的事情:

sed -i 's/restartfreq\([\s]\)*\([0-9]\)*/restartfreq\1$((\2/2))/2/g' \
    my_file.conf
其中第二个匹配项除以2,然后放回内联编辑

我读到塞德不会做数学

我可以单独用sed或awk干净地完成这项工作吗?请给我一些建议

编辑1
我认为我的调查的意义很简单,但我想我可能没有给出一个足够好的数据样本,我想修改。下面是我要内联编辑的*.conf文件中的行的示例:

restartfreq        1250    ;# 2500steps = every 1.25 ps
我在下面发布了一个解决方案。我收到的两个答案都是关于将文本打印到终端,而不是内联编辑文件。我尽量避免回答我自己的问题,但在这种情况下,我收到的答案都没有达到我的要求(编辑文件,而不仅仅是打印编辑的行),它们比我的解决方案长很多,并且/或者除了awk或sed之外,还需要额外的linux程序

不过,我非常感谢您的帮助和反馈!:)


注意:正如我通常的免责声明,这不是一个家庭作业问题,我是一名化学工程研究员。

这可能与您正在寻找的内容大致相同:

$ echo 'restart 4' | awk '{$2=$2/2; print}'
restart 2
如果您始终希望数字为整数,请将
$2/2
更改为
int($2/2)


要覆盖文件,可以使用海绵(如果有)或临时文件

后者应该是不言自明的。
海绵让你做到:

$ awk -f script.awk my_file.conf | sponge my_file.conf

下面的解决方案实际上是以内联方式编辑文件,只使用一个命令,并且比其他建议的解决方案(IMHO)更加优雅

为回答我自己的问题向丹尼斯等人表示歉意,但我觉得这是最好的解决方案,希望这将有利于阅读本文的其他人

编辑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

也许这可以简化,但至少它是有效的!:)

这就是只使用awk的方式

 awk '$1=="restartfreq"{$2=$2/2;}1' file > t && mv t file

查看一些示例数据和所需的输出可能会有所帮助2500steps=每1.25 psYes一次,但是如果文件中有重新启动行,您可以进行内联编辑吗?注意sed命令中的-i。另外,谢谢你的帮助,你总是对我的问题做出很好的回答@杰森:我建议你使用ghostdog74显示的临时文件。我在bash脚本中。我应该尝试嵌套您的awk脚本吗?另外,如果我没有弄错的话,它只是打印值,不会内联编辑文件。。。注意sed命令上的“-i”选项。我需要使用正则表达式在文件中找到行,将数字除以2,然后将修改写入文件。谢谢我强烈建议您使用临时文件而不是临时文件!@鬼怪74,是的,仔细检查。唯一不受欢迎的是,我想使用一个上限函数来确保数字向上舍入。很好,比我的解决方案短,相当多!:)
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
 awk '$1=="restartfreq"{$2=$2/2;}1' file > t && mv t file