2014-06-12 59 views
3

我想在sed命令中使用命令行参数,其中我正在将参数包装在“'中。我的命令是:在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

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

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

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

编辑:正如评论所说,我加入周围参数引用双引号,以防止空间从breaking命令解析(这不应该是必要的周围$2正如我们刚才的整数关口,但它的很多更好地为$1$3

+0

+1解决真正的问题。?你应该用双引号的参数参照,虽然。 – mklement0

+0

@ mklement0没错,我刚刚编辑我的帖子,添加双引号。感谢您提供有关论证功能的细节,这对我来说也是有益的:) – Qeole

+0

我的荣幸;感谢您更新您的答案。 – mklement0

4

更新

而我的水平线后说(原答案)一般真,真正的问题是OP的错误的观念该位置参数($1, ...)可以在第一个后脚本(文件名)参数之后传递给参数sed。后
所有参数sed的脚本参数,实际上,参数,sed在一般没有其他类型的参数或shell变量的概念 - 任何引用shell变量或参数必须是展开前脚本传递到sed
一般而言,参数$1,...是壳只构建引用传递给无论是当前shell或壳功能,该函数内部的参数。

  • @Qeole's answer提供了一种基于一个壳功能,这是最好的选择的溶液。
  • 另外,使用变量
countBefore=2 newChar='A' 
sed 's/^\(.\{'"$countBefore"'\}\)./\1'"$newChar"'/' out2.fa 

注:

  • 你说changes the 2nd position to an A。实际上,你的命令有效地取代了第3个字符($countBefore+1 -nth)。)
  • 你说,I am currently wrapping the arguments in ''。实际上,这是sed脚本,它包含在''中,并且您正在中拼接未引用参数引用。我的基于变量的解决方案双引号拼接参数的鲁棒性。
  • 在变量引用拼接另一种方法是简单地双引号整个sed脚本并使用嵌入变量引用

    sed "s/^\(.\{$countBefore\}\)./\1$newChar/" out2.fa 
    

sed: -e expression #1, char 21: Invalid content of \{\}是GNU sed的方式说,你指定的内容{...}$1)不等于有效的重复ition-count表达式。

换言之的$1你的情况的值是以下的NONE:

  • 区区十进制数(例如,2),接着,
  • 一个十进制数,任选随后乘以另一个十进制数(例如,2,2,3
  • ,,后面跟一个十进制数(例如,,3

确保$1是以上之一。

+0

感谢文本的例子 – brucezepplin