2014-06-12 61 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