2012-09-11 567 views

回答

31

SED方式

$ echo '(1 2 3 4 5 6 7)' | sed 's/^.\(.*\).$/\1/' 
1 2 3 4 5 6 7 

awk的方式

$ echo '(1 2 3 4 5 6 7)' | awk '{print substr($0, 2, length($0) - 2)}' 
1 2 3 4 5 6 7 

POSIX sh的方式

$ var='(1 2 3 4 5 6 7)'; var="${var#?}"; var="${var%?}"; echo "$var" 
1 2 3 4 5 6 7 

bash的方式

$ var='(1 2 3 4 5 6 7)'; echo "${var:1: -1}" 
1 2 3 4 5 6 7 

如果您使用bash,則使用bash方式。

如果不是,則更喜歡posix-sh方式。它比裝載sedawk要快。

除此之外,您還可能正在進行其他文本處理,您可以將其與此結合使用,因此根據腳本的其餘部分,您最終可能會使用sedawk


爲什麼不這項工作? sed '..' s_res.temp > s_res.temp

這不起作用,因爲重定向>將在讀取文件之前截斷文件。 爲了解決這個問題,你有一些選擇:

  1. 你真正想要做的是編輯文件。 sed是一個流編輯器不是文件編輯器。
    ed雖然,是一個文件編輯器(也是標準的!)。因此,使用ed

    $ printf '%s\n' "%s/^.\(.*\).$/\1/" "." "wq" | ed s_res.temp 
    
  2. 使用臨時文件,然後mv它來替換舊的。

    $ sed 's/^.\(.*\).$/\1/' s_res.temp > s_res.temp.temp 
    $ mv s_res.temp.temp s_res.temp 
    
  3. 使用sed-i選項。這僅與GNU-sed的工作,如-i POSIX和GNU-只:

    $ sed -i 's/^.\(.*\).$/\1/' s_res.temp 
    
  4. 濫用殼(不推薦真的):

    $ (rm test; sed 's/XXX/printf/' > test) < test 
    

在Mac OS X(最新版本10.12 - Sierra)bash被卡住到版本3.2.57,這是相當古老。人們總是可以使用brew安裝bash並獲得版本4.x,其中包括上述工作所需的替換。

有bash的版本和相應的變化的集合,在bash-hackers wiki

+0

太棒了!非常感謝!!!!! – user1508893

+0

我喜歡使用'sed'。但有一個問題,爲什麼這不起作用? 'sed's/^。\(。* \)。$/\ 1 /'s_res.temp> s_res.temp'? – user1508893

+0

,因爲重定向會在讀取之前截斷文件。我會爲此更新我的答案。 – c00kiemon5ter

0

而且還編了一個Perl方式:

perl -pe 's/^.|.$//g' 
1

從給定的字符串中刪除第一個和最後一個字符,我喜歡此sed

sed -e 's/^.//' -e 's/.$//' 
#   ^^   ^^ 
# first char   last char 

參見一個例子:

sed -e 's/^.//' -e 's/.$//' <<< "(1 2 3 4 5 6 7)" 
1 2 3 4 5 6 7 
相關問題