2017-07-26 82 views
0

我得到字符串10.11.12。我想把所有東西都放到第二個點上,換句話說,在這種情況下,我想返回10.11使用bash提取子字符串

我正在使用bash,但無法弄清楚。我希望sed可能會有所幫助,但我花了數年時間搜索並找不到它。例如這沒有工作:

$ echo 10.11.12 | sed "s/\d*\.\d*/\0/p" 
10.11.12 
10.11.12 

幫助!

+0

你試試AWK? – hbagdi

+0

與sed,你需要像'echo'10 .11.12'| sed -E'/ ^([^。] + \。[^。] +)。*/\ 1 /''參見[regex capture groups](https://stackoverflow.com/documentation/regex/660/ capture-groups#t = 201707261351266830526)....同樣,[sed不支持\ d](https://unix.stackexchange.com/questions/119905/why-does-my-regular-expression-work- in-x-but-in-y)...對於你正在嘗試的方法,'echo '10 .11.12'| grep -oP'^ \ d * \。\ d *''最接近 – Sundeep

回答

3

請參閱BashFAQ #100(「如何在bash中進行字符串操作?」)。像許多常見操作一樣,這可以通過parameter expansion完成。

s=10.11.12 
result="${s%.*}" # Remove everything after the last . 
echo "$result" 

當然,你可以直接進入:

echo "${s%.*}" 
+0

Thx Charles。有沒有什麼方法可以嵌入在參數擴展中產生's'的表達式?該表達式是'psql -c「select version()」-q -t | awk'{print $ 2}'| head -1' bash simpleton這裏恐怕 – jamiet

+0

如果你已經在使用'awk',不妨讓它爲你完成工作。 (實際上,'awk'也可以*執行'head'的工作,將它放到一個命令中...... *或*我們可以修改'psql'命令在內部執行過濾,這意味着您不需要其他命令* *;很多選項)。 –

+0

yup,thx。最後用'psql -c「選擇版本()」-q -t |「 awk'{print $ 2}'|頭-1 | awk -F。 '{printf $ 1'。'$ 2;}'' – jamiet

0

你可以做以下的無sed

echo 10.12.13 | rev | cut -d "." -f2- | rev 
+1

這是非常低效的 - 你正在旋轉**三個不屬於bash的進程,並將它們與FIFO連接起來。這是一大堆'fork()'和'exec()'調用shell可以在內部執行的操作。 –

+0

是的,我看到你的答案,然後意識到了同樣的! +1 – hbagdi

0

perl

echo 10.11.12 | perl -pe 's/(.*)\..*/$1/' 

帶給你期待什麼