16

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

この文字列があるとします ( 1 2 3 4 5 6 7 )

括弧を削除したいと思います。

どうすればいいですか?

4

4 に答える 4

48

セドウェイ

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

ウェイクウェイ

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

POSIXの方法

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

バッシュウェイ

$ 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. -iのオプションを使用しますsed。これは、 POSIX および GNU のみで-iなく、GNU-sed でのみ機能します。

    $ 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いつでもインストールして取得できます。bashbrew4.x

bash-hackers wikiでコンパイルされた、bash のバージョンとそれぞれの変更点のコレクションがあります。

于 2012-09-11T03:05:40.243 に答える
5

特定の文字列から最初と最後の文字を削除するには、次のようにします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
于 2015-11-27T13:23:39.973 に答える
1

また、perl の方法:

perl -pe 's/^.|.$//g'
于 2013-09-25T14:36:17.350 に答える