2011-12-07 19 views
2

我想所有的負數轉變爲正數且迄今已想出這個桑達 - 轉換負到正數

echo "-32 45 -45 -72" | sed -re 's/\-([0-9])([0-9])\ /\1\2/p' 

,但它不工作,因爲它輸出:

3245 -45 -72

我以爲用\ 1 \ 2我會得到正數呢?

我哪裏錯了?

+0

什麼只是'sed的「S/- // g''? – ghoti

回答

3

這可能會爲你工作:

echo "-32 45 -45 -72" | sed 's/-\([0-9]\+\)/\1/g' 

原因,爲什麼你的正則表達式失敗是

  1. 你只是做一個單一的替換(無g

  2. 你更換沒有最後的空間。

  3. 最後一個數字沒有空間跟隨,所以它總是失敗。

這工作太但不優雅(只有2位數字):

echo "-32 45 -45 -72" | sed -rn 's/-([0-9])([0-9])(\s?)/\1\2\3/gp' 

當然只有這個例子:

echo "-32 45 -45 -72" | tr -d '-' 
+0

感謝potong - 你能解釋一下你的代碼在這部分工作的方式:\([0-9] \ + \)....他們是否逃避了他們之後的價值觀? – frodo

+1

@frodo我沒有使用'-r'開關(擴展正則表達式)編寫了正則表達式,所以爲了讓parens充當分組元字符,它們必須被轉義,即'sed -r's /( [0-9] +)/.../''將被寫入'sed's/\([0-9] \ + \)/.../''NB '+'也必須逃脫。 – potong

10

爲什麼不直接去掉 - 的?

[[email protected] ~]# echo "-32 45 -45 -72" | sed 's/-//g' 
32 45 45 72 
+0

@frodo你能接受任何答案嗎? 你有沒有面對這個答案的任何問題 –

3

我的第一個想法是不使用sed,如果你不必。 AWK可以理解他們的號碼,並將其轉換正是如此:

echo "-32 45 -45 -72" | awk -vRS=" " -vORS=" " '{ print ($1 < 0) ? ($1 * -1) : $1 }' 

-vRS設置「記錄分隔符」的空間,-vORS設置了「輸出記錄分隔符」的空間。然後它簡單地檢查每個值,看看它是否小於0,如果它是-1則將其相乘,如果不是,則只打印該數字。

在我看來,如果你不使用sed,這是更「正確的」,因爲它把數字看作數字。

2

你正在處理數字和一串字符。更適當的將是存儲在數組中,並使用內置Shell Parameter Expansion號碼刪除減號:

[~] $ # Creating and array with an arbitrary name: 
    [~] $ array17=(-32 45 -45 -72) 
    [~] $ # Calling all elements of the array and removing the first minus sign: 
    [~] $ echo ${array17[*]/-} 
    32 45 45 72 
    [~] $