2012-09-11 13 views
10

awk/sedを使用して文字列の最初と最後の文字を削除するのは簡単ですか?文字列の最後と最初の文字を取り除く

は、私はそれから括弧を除去したいと思い、この文字列 (1 2 3 4 5 6 7)

を持っていると言います。

どうすればよいですか?

答えて

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方法をお勧めします。それは、sedまたはawkの読み込みよりも速いです。

これ以外にも、他のテキスト処理を行っている可能性があります。これは他のスクリプトによっては、最後にsedまたはawkを使用すると効果があります。


なぜこの仕事をしますか? 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オプションを使用します。

    $ sed -i 's/^.\(.*\).$/\1/' s_res.temp 
    
  4. 虐待シェル(実際にはお勧めしません):

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

-iない POSIXとGNU-のみであるとして、これは、GNU-のsedで動作しますMac OS X(最新バージョン10.12 - Sierra)bashはかなり古いバージョン3.2.57に固執しています。 brewを使用して常にbashをインストールし、上記の動作に必要な置換を含むバージョン4.xを得ることができます。

bash-hackers wiki

+0

恐ろしい!どうもありがとう!!!!! – user1508893

+0

私は 'sed'を使いたいです。 1つの質問、なぜ、これは動作しませんか? 'sed 's/^。\(。* \)。$/\ 1 /' s_res.temp> s_res.temp'? – user1508893

+0

リダイレクトはファイルを読み込む前に切り捨てるためです。私はこれについて私の答えを更新します。 – c00kiemon5ter

0

もperlの途中でコンパイルしたbashのバージョンとそれぞれの変化のコレクションがあります:指定した文字列から最初と最後の文字を削除するには

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 
関連する問題