修改行后返回整个文档 - sed

修改行后返回整个文档 - sed

我正在尝试创建一个脚本来反复修改变量的值,然后将此修改保存在另一个文件中以便稍后运行。然而,当使用:

sed '0,/pattern/  c\epsilon = ' $VaR $NameOfFile \
 > "NeWFile${VaR2}.txt"

它只返回已更改行的文本。

我的程序的一个例子是:

..blablabla..
epsilon = 10
..moreblablabla..

执行我的脚本后,我得到了新文件及其名称,但仅包含:

epsilon = 34
..moreblablabla..

我想将第一次出现的 epsilon 更改为另一个值,并将修改后的整个文件输入到具有不同名称的新文件中。

到目前为止我写的脚本是:

#!/bin/sh    
echo 'Hello, enter the name of the file you want to process with sed'
read NaMeoFFiLe
echo ''
echo 'Now, you should input the value of epsilon' \
        'you want to start with the loop'
read startepsilonvalue
echo Start epsilon value will be $startepsilonvalue
let lastepsilonvalue=$startepsilonvalue+1 #increase var by 1
echo Last epsilon value is: $lastepsilonvalue
let stteps=$startepsilonvalue*10
let lsteps=$lastepsilonvalue*10
for ((i=$stteps; i<=$lsteps; i+=1)); do
        k=$(bc <<<"""scale=1; $i /10")
        echo $k
        sed '0,/epsilon =/ c\epsilon = '$startepsilonvalue $NaMeoFFiLe \
               > "sample2iter${k}.txt"
done

也欢迎对代码最佳实践的任何其他评论。

答案1

这就是c\命令的工作方式(强调我的):

    c\ 文本
    
        删除行匹配地址或地址范围,并输出
        该命令后面的文本行。

通过稍加修改,您可以将更改限制为仅范围的最后一行:

sed -e '0,/epsilon = /{//c\epsilon = '"$startepsilonvalue" -e '}' "$NaMeoFFiLe"

(空的正则表达式//重复使用以前的正则表达式,而将右大括号拆分为单独的表达式的技巧-e可以防止 sed 将其视为更改文本的一部分)或尝试改为

sed '0,/epsilon = .*/s//epsilon = '"$startepsilonvalue"'/' "$NaMeoFFiLe"

相关内容