Bash:使用文件输入运行 sed 操作

Bash:使用文件输入运行 sed 操作

我正在尝试在 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

既然你说这个命令是脚本的一部分,这让我相信

  1. 该脚本有错误,并且在调用时使用的变量名称中包含拼写错误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
    
  2. 您可能错误地使用了脚本,例如没有为其提供正确的选项或文件名参数。


至于您尝试的修复,没有一个是正确的。既然你正在使用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

相关内容