Bash 如何将数学与正则表达式';是Awk还是Sed?
我以前在sed中使用过正则表达式,并使用了一些awk,但我不确定这里需要的确切语法 我想做一些类似的事情: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 -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