这似乎是一个相对基本的问题,但经过一个小时的搜索,我无法在任何地方找到它。 许多(有很多!)类似的问题似乎没有达到目的。
我正在编写script(" vims")以类似sed的模式使用vim(所以我可以在流输入上调用普通的vim命令而不实际打开vim),所以我需要使用" -c"将每个参数传递给vim。国旗前面有它。还有许多字符需要转义(我需要传递正则表达式),因此SO上的一些常用方法不起作用。
基本上,我写的时候:
cat myfile.txt | vims ':%g/foo/exe "norm yyPImyfile: \<esc>\$dF,"' ':3p'
这是在stdout上运行的两个命令行vim参数,
我需要将这两个单引号参数传递给完全它们对我的函数vims()
的方式,然后用-c
标记标记每个参数,所以它们是解释为vim中的命令。
这是我迄今为止所做的尝试:
vims() {
vim - -nes -u NONE -c '$1' -c ':q!' | tail -n +2
}
这似乎适用于单个命令。没有字符被转义,&#34; -c&#34;国旗在那里。
然后,使用经常复制的问答,"$@"
技巧,我试过了:
vims() {
vim - -nes -u NONE $(for arg in "$@"; do echo -n " -c $arg "; done) -c ':q!' | tail -n +2
}
这似乎打破了我传递的每个字符串中的空格,所以不起作用。我还尝试了printf
命令的一些变体,正如其他问题中所建议的那样,但这与vim命令序列有奇怪的交互。我在永久编辑测试循环中尝试了许多其他不同的反斜杠引用组合,但总是在我的方法中找到了一个怪癖。
我缺少的命令序列是什么?
答案 0 :(得分:5)
一次一个地向一个数组添加所有参数,然后通过适当的引用将整个数组传递给vim,以确保正确保留空格。
vims() {
local args=()
while (($# > 0)); do
args+=(-c "$1")
shift
done
vim - -nes -u NONE "${args[@]}" -c ':q!' | tail -n +2
}
根据经验,如果你发现自己试图逃避事情,添加反斜杠,使用printf
等,你可能会走错路。小心使用引用和数组将涵盖大多数情况。