我可以使用 bash 用包含引号的新行替换文件中的一行吗?

问题描述

我在文本文件中有一行类似于 s:Variable = "Path/to/file" 但我正在做的是使用 bash 中的 while 循环用不同的“换行符”替换该行脚本。

我这样做的方式是通过这个命令

sed -i '' '5s/.*/'$newline'/' 输出文件.txt

我在哪里用 $newline 替换 Outputfile.txt 中的第五行。我已经尝试了各种 "" 和 '' 实例或使用 ${newline} 但我似乎无法让它工作。换行符本身有引号这一事实似乎存在问题,因为我需要在新的文本文件中使用引号。

这是我存储的换行符:

newline='s:Variabels = "Path/to/80kVp/NAME'${i}'_1"'

循环变量 i 的位置。

关于如何处理这个问题有什么想法吗?

输出错误:sed:1:“5s/.*/s:Sc/DosetoCompon ...”:替代命令中的错误标志:'D

解决方法

这里的问题仅与引号略有相关——您得到的错误是因为您从 $newline 得到的替换文本包含 / 字符。这会在第一个 s 处结束 sed / 命令,使其将后面的字符视为修饰符。由于 D(第一个 / 之后的第一个字符)不是有效的修饰符,因此您会收到错误消息。最简单的解决方法是对替换文本中的 / 字符进行转义:

newline='s:Variabels = "Path\/to\/80kVp\/NAME'${i}'_1"'

另一种可能性(仅适用于某些版本的 sed)是使用不同的字符来分隔 s 命令:

sed -i "5s|.*|$newline|" Outputfile.txt

仅在替换文本不包含 |

时才有效