我通常将环境变量VISUAL和EDITOR环境变量都设置为相同的东西,但有什么区别呢?为什么我要以不同的方式设置它们?当开发应用程序,我为什么要选择看VISUAL之前EDITOR,反之亦然?
我必须用另一个文本块替换文件中的一大块文本(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/ 之间有一个块,其中的行数不固定(变化)将被替换为新文本(代码),该怎么办它 ?
使用ex我打开 3 个文件
ex file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
我知道
:n转到文件 2 和文件 3:rew从文件 3 或文件 2 转到文件 1但是我可以使用什么命令转到上一个文件?我认为:e previousfile会起作用,但是是否:n存在像以前一样更快的东西?
我正在搞乱 vim one 衬垫,我无法逃脱 . vim ex 模式追加命令中的字符。
基本上,
vim -En '+a|Hello World' '+p' '+q!' -
Run Code Online (Sandbox Code Playgroud)
打印“你好世界”
但,
vim -En '+a|.' '+p' '+q!' -
Run Code Online (Sandbox Code Playgroud)
根本不打印任何东西。这 。在一行本身结束 append 命令,所以我无法打印它。
不幸的是,这意味着我无法编写允许我链接命令的 vim -E 命令脚本。我想要这样的东西,第一个 vim 调用构造 Ex 命令,第二个解释它们
vim -En '+a|aConvoluted Hello World
.
Qp
QZQ
' | vim -En
Run Code Online (Sandbox Code Playgroud)
但是第一次调用失败了:来自 . 被忽略。
有什么办法可以逃避点吗?(这有点像代码高尔夫球,所以它只能是 vim)
有兴趣者的高尔夫规则:
b,c,d,e,f,k,p,r,s,t,{,},$,&,;,/,:,@,#,,,(,),< ,>,! 允许使用所有大写字符。
我想通过使用EOEX构造修改文件中的特定行,例如第 5 行,如何实现我的目标?我用来实现我的目的的代码片段如下:
#!/bin/bash
S=0.030
F=0.150
N=30
DIFF=`echo "scale=3; $F - $S" | bc -l`
dw=`echo "scale=3; $DIFF / $N" | bc -l`
is=`echo "scale=3; $S / $dw" | bc -l`
if=`echo "scale=3; $F / $dw" | bc -l`
ex ~/Desktop/Dropbox/MATLAB/FFT.m <<EOEX
:5s/for*/for i = $S:$dw:$F/g
:x
EOEX
Run Code Online (Sandbox Code Playgroud)
我做了一些研究并了解到通常EOF(文件结尾)here scripts 用于I/O重定向到特定命令的标准输入(在我的情况下是ex)。我还了解到,只要开始和结束关键字相同,任何单词都可以代替EOF. 我的问题是,for loop在Matlab此脚本中用另一个初始化程序替换该行的预期效果不会删除该行并将字符串附加到第五行的末尾。出于参考目的,我还添加了我的 FFT.m 文件。对于之前我的问题的抽象性给您带来的不便,我深表歉意。请注意,我也愿意使用另一个程序来达到预期的效果,但很好奇为什么不能在ex或vim。请单击此处获取 Matlab 脚本。