我想所有的負數轉變爲正數且迄今已想出這個桑達 - 轉換負到正數
echo "-32 45 -45 -72" | sed -re 's/\-([0-9])([0-9])\ /\1\2/p'
,但它不工作,因爲它輸出:
3245 -45 -72
我以爲用\ 1 \ 2我會得到正數呢?
我哪裏錯了?
我想所有的負數轉變爲正數且迄今已想出這個桑達 - 轉換負到正數
echo "-32 45 -45 -72" | sed -re 's/\-([0-9])([0-9])\ /\1\2/p'
,但它不工作,因爲它輸出:
3245 -45 -72
我以爲用\ 1 \ 2我會得到正數呢?
我哪裏錯了?
這可能會爲你工作:
echo "-32 45 -45 -72" | sed 's/-\([0-9]\+\)/\1/g'
原因,爲什麼你的正則表達式失敗是
你只是做一個單一的替換(無g
)
你更換沒有最後的空間。
最後一個數字沒有空間跟隨,所以它總是失敗。
這工作太但不優雅(只有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 '-'
爲什麼不直接去掉 - 的?
[[email protected] ~]# echo "-32 45 -45 -72" | sed 's/-//g'
32 45 45 72
@frodo你能接受任何答案嗎? 你有沒有面對這個答案的任何問題 –
我的第一個想法是不使用sed,如果你不必。 AWK可以理解他們的號碼,並將其轉換正是如此:
echo "-32 45 -45 -72" | awk -vRS=" " -vORS=" " '{ print ($1 < 0) ? ($1 * -1) : $1 }'
-vRS設置「記錄分隔符」的空間,-vORS設置了「輸出記錄分隔符」的空間。然後它簡單地檢查每個值,看看它是否小於0,如果它是-1則將其相乘,如果不是,則只打印該數字。
在我看來,如果你不有使用sed,這是更「正確的」,因爲它把數字看作數字。
你正在處理數字和一串字符。更適當的將是存儲在數組中,並使用內置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
[~] $
什麼只是'sed的「S/- // g''? – ghoti