我正在尝试在 bash 脚本中使用 sed 并以文件作为输入。当我在命令行中运行相同的命令时,它可以工作。但是当我使用该文件作为 sed 命令脚本的输入时,我得到
sed: can't read : No such file or directory
在命令行上:
sed -i 's/.*abd.*/xyz/ input.txt
当我将其制作成具有多个 sed 命令的脚本并将文件作为输入传递时,它不起作用。
在我尝试过的脚本中(没有一个起作用)
sed -i 's/.*abd.*/xyz/' < "$1"
sed -i 's/.*abd.*/xyz/' < '$1'
sed -i 's/.*abd.*/xyz/' $1
脚本
./sed_script.sh input.txt
答案1
要重现错误,必须使用名称长度为零的文件:
$ sed -i 's/.*abd.*/xyz/' ""
sed: can't read : No such file or directory
既然你说这个命令是脚本的一部分,这让我相信
该脚本有错误,并且在调用时使用的变量名称中包含拼写错误
sed
,如filename=$1 sed -i 's/.*abd.*/xyz/' "$fliname" # should have been "$filename"
或者
for i in something; do sed -i 's/.*abd.*/xyz/' "$1" # should have been "$i" done
您可能错误地使用了脚本,例如没有为其提供正确的选项或文件名参数。
至于您尝试的修复,没有一个是正确的。既然你正在使用sed -i
,你不能从标准输入读取,并从名称为 的文件进行重定向$1
。
最后一个变体,
sed -i 's/.*abd.*/xyz/' $1
大部分是正确的,但需要$1
引用为"$1"
,否则它将无法正确处理名称中带有空格或通配模式等的文件名。
非常不幸的是,您从未说过在脚本中尝试这些命令变体时会发生什么,也从未说过脚本中的错误命令实际上是什么样子(或者脚本的其余部分实际上做了什么)。这将使调试问题变得更容易。
请注意,上面的命令(通过在周围添加双引号进行更正$1
)并不能保证正常工作,因为我们无法知道在脚本中$1
调用时预期会出现什么内容。sed
答案2
请尝试使用此命令,该命令应该有效:(sed -i 's/.*abd.*/xyz/' $1
确保您的模式正确)如果您使用 i 那么它将自动替换文件内。
跑步 - sed -i 's/.*abd.*/xyz/' input.txt
答案3
我认为您正在尝试替换文本文件中的abd
模式。xyz
我在 NetBSD 上尝试了以下方法并且有效:
#!/bin/bash
sed 's/.*abd.*/xyz/' $1
结果如下:
$ cat input.txt
one.abd.
two.abd.
abd
three
four
$ ./test.sh input.txt
xyz
xyz
xyz
three
four
我会从你的脚本中删除-i
和<
,它应该可以正常工作。或者我已经尝试成功
#!/bin/bash
input=$1
sed 's/.*abd.*/xyz/' $input