Windows 批处理:使用 PuTTY 和 sed 将多行插入远程 Linux 文件的特定位置

Windows batch: Insert multiple lines into a remote Linux file at a specific location using PuTTY and sed

我想在 Linux 文件的特定位置插入多行。 但不是来自 Linux 脚本,而是来自使用 PuTTY(使用 plink 命令)的 Windows 批处理文件。

我在这里查看了这个答案:

据此,我创建了以下 Windows 命令,该命令在 "some.yml" 文件中的“#SOMETAG”之后添加了四行 "Hello" 行。这是工作文件:

plink -batch -l SomeUser -pw SomePwd SomeLinuxComputer sed '/#SOMETAG/a Hello1\nHello2\nHello3\nHello4' ./some.yml

现在我看到这个答案中有一个很好的语法:

如果我直接在 Ubuntu bash 中使用此命令,它可以工作文件:

sed '/#SOMETAG/r'<(\
  echo "Hello1";\
  echo "Hello2";\
  echo "Hello3";\
  echo "Hello4";\
) -- ./some.yml

但是如何使用 plink 从 Windows 批处理中使用它?

以下方法无效:

plink -batch -l SomeUser -pw SomePwd SomeLinuxComputer sed '/#SOMETAG/r'<(\^
  echo "Hello1";\^
  echo "Hello2";\^
  echo "Hello3";\^
  echo "Hello4";\^
) -- ./some.yml

它生成消息 "The system cannot find the file specified"。

即使像这里这样更简单的版本也会产生相同的错误消息:

plink -batch -l SomeUser -pw SomePwd SomeLinuxComputer sed '/#SOMETAG/r'<(echo "Hello") -- ./some.yml

有人可以帮助我吗?


编辑 2019-08-29:

可以将问题开头包含的单行版本拆分为多行,并使用 ^:

进行转义
plink -batch -l SomeUser -pw SomePwd SomeLinuxComputer sed '/#SOMETAG/a^
Hello1\n^
Hello2\n^
Hello3\n^
Hello4^
' ./some.yml

但这不是一个完美的解决方案,因为缩进 "Hello" 行会在输出中产生前导空白(我不希望有)。 这就是为什么基于 的解决方案会很好的原因。

在 MartinPrikryl 提示我忘记转义 < 之后,我用转义的 < 字符做了一些额外的测试。

仅添加一条 Hello 线路的示例现在工作正常:

plink -batch -l SomeUser -pw SomePwd SomeLinuxComputer sed '/#SOMETAG/r'^<(echo "Hello") -- ./some.yml

但是添加多个 Hello 行的另一个示例现在产生错误“bash: -c: line 0: unexpected EOF while looking for matching `)'":

plink -batch -l SomeUser -pw SomePwd SomeLinuxComputer sed '/#SOMETAG/r'^<(\^
  echo "Hello1";\^
  echo "Hello2";\^
  echo "Hello3";\^
  echo "Hello4";\^
) -- ./some.yml

您正在指定文件的相对路径,但您不知道远程会话的当前目录 (".") 是什么。尝试指定完整路径,例如“/home/me/some.yml”

问候

您consider/Is可以接受使用-m提供命令吗?

plink -batch -l SomeUser -pw SomePwd SomeLinuxComputer -m command.txt

command.txt 为:

sed '/#SOMETAG/r' <(
  echo "Hello1"
  echo "Hello2"
  echo "Hello3"
  echo "Hello4"
) -- ./some.yml

如果您不想要额外的单独文件,您可以通过批处理生成 command.txt


另一种选择是通过本地命令(批处理文件)提供输入,例如:

(
    echo Hello1
    echo Hello2
    echo Hello3
    echo Hello4
) | plink -batch -l SomeUser -pw SomePwd SomeLinuxComputer "sed '/#SOMETAG/r' - ./some.yml"