我必须用另一个文本块替换文件中的一大块文本(shell 脚本代码)。
我对如何使用 sed 替换多行字符串印象深刻?由antak回答 ,多线替换由Bruce Ediger回答
但是我在使用它们时遇到了一些麻烦。
antak在他的回答中已经提到,1h;2,$H;$!d;g;
对于大文件,不建议将整个文件 ( )流式传输到缓冲区,因为它会导致内存过载。
我知道sed
可以与块功能一起使用以保持块外的文本不变。我想使用这个功能。但如果我使用,
sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
Run Code Online (Sandbox Code Playgroud)它将为每个流重复插入新文本(代码)。因此,我必须将可视块作为一个流,使用类似于antak之前建议的内容,但用于块(不是用于整个文件)。
正如Bruce Ediger提到的,可以尝试以(点)ex
开头的附加功能,但我的新文本(代码)包含以点开头的行,这可能被认为是附加语法的点。在这种情况下我该如何使用它?a
.
ex
's dd
'number of lines' 可能会删除多行,但是如果我在 /marker1/ 和 /marker2/ 之间有一个块,其中的行数不固定(变化)将被替换为新文本(代码),该怎么办它 ?
假设我的变量中有一个字符串,如下所示。
var="/fnxn/ngfdg/abc.ext"
Run Code Online (Sandbox Code Playgroud)
我可以按如下方式获取此变量的根(删除扩展名 .*)
echo ${var%.*}
Run Code Online (Sandbox Code Playgroud)
我可以得到这个变量的尾部(删除路径*/)如下
echo ${var##*/}
Run Code Online (Sandbox Code Playgroud)
但是现在我必须同时删除路径和扩展名。我可以使用另一个变量分两步完成,如下所示。
var2=${var##*/}
var3=${var2%.*}
Run Code Online (Sandbox Code Playgroud)
但是单步选项(类似于下面的 zsh 语法)在 bash 中显示了一条错误消息“坏替换”。
echo ${${var##*/}%.*}
Run Code Online (Sandbox Code Playgroud)
如果我得到一个单步可理解的选项来减少代码长度并避免额外的环境变量,那将会很有用。