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