Bash:将所有参数完全按原样传递给函数,并在每个参数上添加一个标记

时间:2017-06-25 09:35:23

标签: regex bash unix vim

这似乎是一个相对基本的问题,但经过一个小时的搜索,我无法在任何地方找到它。 许多(有很多!)类似的问题似乎没有达到目的。

我正在编写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命令序列有奇怪的交互。我在永久编辑测试循环中尝试了许多其他不同的反斜杠引用组合,但总是在我的方法中找到了一个怪癖。

我缺少的命令序列是什么?

1 个答案:

答案 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等,你可能会走错路。小心使用引用和数组将涵盖大多数情况。