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"
我想在 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"