我想在sed命令中使用命令行参数,我现在将参数包装在''中。我的命令是:
mycomputer$ sed 's/^\(.\{'$1'\}\)./\1'$2'/' out2.fa 2 A
基本上查看文件中的一行,并将第二个位置更改为A.当我对其进行硬编码时,这会有效,但上述结果为:
sed: -e expression #1, char 21: Invalid content of \{\}
我也应该使用$ 2和$ 3作为命令行参数,因为文件名在技术上是第一个参数?
答案 0 :(得分:4)
<强>更新强>:
虽然我在水平线(原始答案)之后所说的一般是正确的,但真正的问题是OP的错误信念位置 string < / em> arguments($1
,...)可以在第一个后脚本(文件名)参数之后通过参数传递给sed
。
sed
脚本参数之后的所有参数实际上是 filename 参数, sed
没有概念其他类型的参数或shell变量一般 - 对shell变量或参数的任何引用都必须扩展,然后将脚本传递给{{1 }} 即可。
通常,参数sed
,...是仅用于shell的构造,它们引用传递给当前shell 的参数,或者在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
来说要好得多。