在sed命令中使用命令行参数

时间:2014-06-12 21:47:48

标签: bash command-line sed

我想在sed命令中使用命令行参数,我现在将参数包装在''中。我的命令是:

mycomputer$ sed 's/^\(.\{'$1'\}\)./\1'$2'/' out2.fa 2 A

基本上查看文件中的一行,并将第二个位置更改为A.当我对其进行硬编码时,这会有效,但上述结果为:

sed: -e expression #1, char 21: Invalid content of \{\}

我也应该使用$ 2和$ 3作为命令行参数,因为文件名在技术上是第一个参数?

2 个答案:

答案 0 :(得分:4)

<强>更新

虽然我在水平线(原始答案)之后所说的一般是正确的,但真正的问题是OP的错误信念位置 string < / em> arguments($1,...)可以在第一个后脚本(文件名)参数之后通过参数传递给sed
sed脚本参数之后的所有参数实际上是 filename 参数, sed没有概念其他类型的参数或shell变量一般 - 对shell变量或参数的任何引用都必须扩展,然后将脚本传递给{{1 }} 即可。
通常,参数sed,...是仅用于shell的构造,它们引用传递给当前shell 的参数,或者在shell 中功能,那个功能。

  • @Qeole's answer提供基于 shell函数的解决方案,这是最佳选择
  • 或者,使用变量
$1

注意:

  • 你说countBefore=2 newChar='A' sed 's/^\(.\{'"$countBefore"'\}\)./\1'"$newChar"'/' out2.fa 。实际上,您的命令有效地替换了 3rd 字符(changes the 2nd position to an A - nth)。)
  • 你说,$countBefore+1。实际上,它是I am currently wrapping the arguments in '' 中包含的 sed脚本,并且你拼接 < strong> unquoted 参数引用。我的基于变量的解决方案双引号拼接变量引用的稳健性。
  • 在变量引用中拼接的替代方法是简单地双引用整个''脚本并使用嵌入式变量引用

    sed

sed "s/^\(.\{$countBefore\}\)./\1$newChar/" out2.fa 是GNU sed: -e expression #1, char 21: Invalid content of \{\}的方式,说明你指定进入sed{...})的内容并不等于有效的重复 - 计数表达。

换句话说:在您的情况下,$1的值不是以下内容:

  • 十进制数(例如$1
  • 十进制数字后跟2,可选地后跟另一个十进制数字(例如,2,
  • 2,3,后跟十进制数字(例如,

确保,3是以上之一。

答案 1 :(得分:4)

我不确定是否可以从命令行访问$1$2 ...等等。

相反,您可以尝试从函数运行您的行。你绝对可以将参数传递给函数。

foo() { sed 's/^\(.\{'"$2"'\}\)./\1'"$3"'/' "$1"; }
foo out2.fa 2 A

编辑:正如评论中所建议的,我在参数引用周围添加了双引号,以防止空格破坏命令解析(在$2周围不应该这样做,因为我们只是通过了整数,但对$1$3来说要好得多。