2011-07-22 32 views
3

是否可以操縱sed中的&符號?我想爲文件中的所有數字添加+1。事情是這樣的:在sed中操作&符號

sed -i "s/[0-9]\{1,2\}/$(expr & + 1)/g" filename 

編輯:今天,我創造了用grep循環和sed,做必要的工作。但問題仍然存在,如果有人知道操縱&符號的方式,因爲這不是我第一次在替換字符串上運行命令,並且不能

回答

1

sed將需要在的每個行上執行某些shell命令(帶'!')。

在這裏你認爲你打電話給sed,然後調用shell來評估$(expr & + 1)對於每一行,但實際上並非如此。 $(expr & + 1)只會得到由外殼靜態評估(一次),並導致錯誤,因爲'&'不是在這一點上的數字。

要真正做到這一點,無論是: '1,$'

  1. hardcode all ten cases of last digit 0..9, as per this example in sed documentation

  2. 使用一個sed命令與開始在每一行上調用shell,然後在那裏執行遞增,包括expr,awk,perl或其他。

  3. 腳註:我從來不知道/e modifier,php-coder顯示。

+0

或者讓sed命令寫一個shell腳本來評估。 –

+0

我不明白!像這樣? sed''1,$!' s/[0-9] \ {1,2 \} /'$(expr&+ 1)'/ g'filename –

+0

我現在無法訪問UNIX shell,因此您必須使用它小。 – smci

1

偉大的問題。 smci首先回答,並發現了關於貝殼的事情。

如果你想解決一般這個問題,這裏是(爲了好玩)嵌入例如Ruby的解決方案:

echo "hdf 4 fs 88\n5 22 sdf lsd 6" | ruby -e 'ARGF.each {|line| puts line.gsub(/(\d+)/) {|n| n.to_i+1}}' 

輸出應該

hdf 5 fs 89\n6 23 sdf lsd 7 
+0

謝謝!我沒有安裝紅寶石!沒有真正值得安裝只爲此! –

2

您可以使用e修飾符實現此目的:

$ cat test.txt 
1 
2 
$ sed 's/^[0-9]\{1,2\}$/expr & + 1/e' test.txt 
2 
3 

在這種情況下,您應該構建命令在替換部分將被執行和結果將用於替換。

+0

幾乎在那裏!該文件只有數字。它也有括號,所以我得到:sh:語法錯誤:「(」意想不到 –

+0

@ teresa-e-junior我更新了數字的正規表達式 –

+0

對不起,沒有正確解釋:內容混合:$ vbx02-> pack_start( $ hbx01); –