Bash 使用exec vi时出错 使用sed

Bash 使用exec vi时出错 使用sed,bash,shell,scripting,vi,heredoc,Bash,Shell,Scripting,Vi,Heredoc,如果我理解正确,您希望在文件开头添加两行。在这种情况下,按照Cyrus的建议,运行: Vim(?):Warning: Input is not from a terminal Vim: Error reading input, exiting... Press ENTER or type command to continueVim: Finished. Vim: Error reading input, exiting... Vim: Finished. 注: 使用shell变量时,除非

如果我理解正确,您希望在文件开头添加两行。在这种情况下,按照Cyrus的建议,运行:

Vim(?):Warning: Input is not from a terminal
Vim: Error reading input, exiting...

Press ENTER or type command to continueVim: Finished.
Vim: Error reading input, exiting...

Vim: Finished.
注:

  • 使用shell变量时,除非希望执行分词和路径名扩展,否则该变量应使用双引号。例如,这对于文件名很重要,因为现在文件名通常包含空格

  • 最好对shell变量使用小写或混合大小写的名称。系统对其变量使用大写名称,您不希望意外覆盖其中一个变量

  • 在检查参数时,
    if
    语句应包含一个
    exit
    ,以防止在未提供参数的情况下运行脚本的其余部分。在上面,我们添加了
    exit 1
    ,它将exit code设置为1以表示错误

  • 使用
    vi
    让我们从这个测试文件开始:

    #!/bin/bash
    if [ $# -ne 1 ]
    then
       echo "USAGE:vitest filename"
       exit 1
    fi
    
    sed -i.bak '1 s/^/line1\nline2\n/' "$1"
    
    现在,让我们运行
    vi
    ,然后查看文件中的内容:

    $ cat File
    some line
    
    $vi-s使用
    cat

    $ vi -s <(echo $'iline1\nline2\n\eZZ') File
    $ cat File
    line1
    line2
    some line
    

    正如建议的那样,
    ed

    $ cat file1.txt file2.txt | tee file3.txt
    Line 1
    Line 2
    aaaa
    bbbb
    cccc
    

    您希望在
    ex
    模式下启动
    vi
    ,只需对脚本进行一些小的更改

    printf "%s\n" 1i "line1" "line2" . wq | ed file
    

    vi-e“$FILENAME”我建议使用
    sed
    。不是
    sed
    ,而是
    ed
    ex
    。使用
    cat
    这就是它的用途。我会使用你的建议,但我必须使用exec vi。请注意,如果使用
    exec
    ,则永远不会到达以下
    退出0
    。你确定你需要的是
    exec vi
    而不是
    vi
    ?谢谢你的提示。我对脚本编写相当陌生,所以这些都非常有价值。有没有办法在这种情况下使用exec vi?@EstebanRodriguez OK。我添加了一个<代码> vi >代码>解决方案。@ Jeang1024,SED的命令不仅仅是代码> S///< /代码>:考虑<代码> I/Cuth>命令插入行。许多<代码> ED < /C>命令对代码> VI>代码>用户非常熟悉:谢谢,Excel解释非常有用。
    ed file << END
    1i
    line1
    line2
    .
    wq
    END
    
    printf "%s\n" 1i "line1" "line2" . wq | ed file
    
    vi -e "$FILENAME" <<EOF
    i
    Line 1.
    Line 2.
    .
    wq
    EOF